SLOTS aus einer anderen Klasse verwenden
Verfasst: 13. Juni 2007 00:31
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:
Der Quelltext des Programmes ist folgender:
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')
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();
}