Seite 1 von 1

SLOTS aus einer anderen Klasse verwenden

Verfasst: 13. Juni 2007 00:31
von GoaSkin
Ich habe mit der Programmiererei ein paar Jahre Pause gemacht und versuche nun ein Konfigurationstool mit Hilfe von QT4.3 unter Mac OS X zu entwickeln.

Da das Programm wenn es fertig ist sehr viele Parameter zu konfigurieren hat, besteht das Hauptfenster aus einigen 100 Widgets und muß stets verändert werden. Nun habe ich festgestellt, daß sich der Designer in der Version 4 nicht mehr als IDE eignet und man scheinbar Widget-Signale auch nur mit den Slots anderer Widgets darüber verbinden kann.

Lange überlegte ich mir, wie ich mit der Programmiererei anfangen kann, ohne die aus der UI-Datei erzeugte Headerdatei modifizieren oder verwursten zu müssen, da ich wie gesagt das UI noch öfters verändern muß und die Header-Datei neu erzeugen. Geeignete Beispiele habe ich nicht gefunden.

Von daher probierte ich es nun einmal aus, eine neue Klasse zu generieren, die aus QMainWindow und der vom UIC erzeugten Klasse erbt und dieser SLOT-Funktionen zuzufügen. Das Hauptfenster mittels dieser Klasse deklariert. Während das Hauptfenster angezeigt wird, versucht das Programm jedoch die SLOT-Funktion für einen Button von QMainWindow abzuleiten und findet den passenden Slot nicht. Ich habe gelesen, daß man bei der Klassen-Deklaration das Makro Q_OBJECT aufrufen soll, was aber dazu führt, daß das Programm nicht gelinkt werden kann. Dabei hilft es auch nicht, MOC- und Projekt-Dateien neu zu erzeugen, wie in einigen Foren empfohlen.

Als aller erstes wollte ich dem Quit-Button eine eigene Funktion verpassen. Bei diesem Code geht das Hauptfenster auf, wobei im Debug-Fenster folgendes zu lesen ist:


Code: Alles auswählen

Object::connect: No such slot QMainWindow::SCDirectQuit(mainwindow)
Object::connect:  (sender name:   'pushButtonQuit')
Object::connect:  (receiver name: 'SC4Config')
Der Quelltext des Programmes ist folgender:

Code: Alles auswählen

#include <QApplication>
#include <QWidget>
#include <QMessageBox>
#include <QMainWindow>


#include "ui_sc4config.h"   // defines Ui::SC4Config

class SCMainWindow :  public QMainWindow, private Ui::SC4Config
 {


 public:
     SCMainWindow(QWidget *parent = 0);

	 
 protected slots:
     void SCDirectQuit(QWidget window);
	 
 private:
 
};

SCMainWindow::SCMainWindow(QWidget *window)
	{
	}

void SCMainWindow::SCDirectQuit(QWidget window)
	{
	QMessageBox QuitBox;
	QuitBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
	switch (QuitBox.exec())
		{
		case QMessageBox::Yes:
			window.close();
		case QMessageBox::No:
			break;				
		default:
			break;
		}	
 	} 




int main(int argc, char *argv[])
	{
	QApplication app(argc, argv);

	SCMainWindow mainwindow;
	Ui::SC4Config ui;
	ui.setupUi(&mainwindow);
	QObject::connect(ui.pushButtonQuit,SIGNAL(clicked()),&mainwindow,SLOT(SCDirectQuit(mainwindow)));

	mainwindow.show();

	return app.exec();
	}

Verfasst: 13. Juni 2007 01:31
von marco
guten abend,

ich hab zwar nicht so ganz verstanden, was du letzten endes vorhast, aber diese zeile kann so schonmal nicht funktionieren:

Code: Alles auswählen

QObject::connect(ui.pushButtonQuit,SIGNAL(clicked()),&mainwindow,SLOT(SCDirectQuit(mainwindow)));
soweit ich das auf die schnelle überblicken kann, ist

1. der slot SCDirectQuit als protected innerhalb der klasse deklariert.

2. kann man einem slot in der form keine parameter übergeben. ein parameter kann man einem slot nur übergeben, indem das signal einen parameter gleichen typs mit emitiert.

am besten liest du hier nochmal nach: http://doc.trolltech.com/4.3/signalsandslots.html

wenn du nochmal versuchst zu beschreiben, vielleicht mit beispiel, was du realisieren willst, können wir dir vielleicht noch den ein oder anderen tipp geben.

Verfasst: 13. Juni 2007 09:07
von upsala

Code: Alles auswählen

void SCMainWindow::SCDirectQuit(QWidget window) 
QWidget hat keine Copy-Konstruktor (oder düfte zumindest keinen haben...)

Ob ein Slot public, protected oder private ist, ist egal, aber man kann trotzdem keine Parameter übergeben...