Seite 1 von 1

Slots in QTabWidget Widgets erreichen

Verfasst: 12. Oktober 2016 14:12
von Netzschleicher
Hallo Liebe Forengemeinde,

ich hoffe das der Betreff nicht zu verwirrend ist.
Ich habe in einem Dialog ein QTabWidget in welchem ich mehrere (derzeit 3) Pages mit GUI-Elementen habe. Die jeweiligen Pages werden durch je eine eigene Klasse repräsentiert. Mein Problem ist nun, das ich gerne die 3 jeweils pro Page-Klasse vorhandenen Slots aus dem Dialog heraus ereichen möchte.
Auf dem Dialog gibt es eine QDialogButtonBox mit 3 Buttons (OK, Apply, Cancel). Beim Klicken auf einen dieser Buttons möchte ich das Signal an die in dem QTabWidget vorhandenen Pages weiterleiten, so das diese individuell darauf reagieren können.

Code: Alles auswählen

...
ui->tabOptionPages->addTab(new PageEnvironment(), tr("Environment"));
ui->tabOptionPages->addTab(new PageDatabase(), tr("Database"));
ui->tabOptionPages->addTab(new PageMiscellaneous(), tr("Miscellaneous"));
...

Code: Alles auswählen

class PageEnvironment : public QWidget {
        Q_OBJECT

    private:    // Attribute

    public:     // Attribute

    public:     // Kontruktoren & Destruktor
        explicit PageEnvironment(QWidget *parent = 0);
        ~PageEnvironment();

    protected:  // Event Methoden
        void changeEvent(QEvent *event);

    private:    // Methoden

    public:     // Methoden

    signals:

    private slots:

    public slots:
    	void dialogOKClicked();
	void dialogApplyClicked();
	void dialogCancelClicked();

};

Code: Alles auswählen

class PageDatabase : public QWidget {
        Q_OBJECT

    private:    // Attribute

    public:     // Attribute

    public:     // Kontruktoren & Destruktor
        explicit PageDatabase(QWidget *parent = 0);
        ~PageDatabase();

    protected:  // Event Methoden
        void changeEvent(QEvent *event);

    private:    // Methoden

    public:     // Methoden

    signals:

    private slots:

    public slots:
    	void dialogOKClicked();
	void dialogApplyClicked();
	void dialogCancelClicked();

};

Code: Alles auswählen

class PageMiscellaneous : public QWidget {
        Q_OBJECT

    private:    // Attribute

    public:     // Attribute

    public:     // Kontruktoren & Destruktor
        explicit PageMiscellaneous(QWidget *parent = 0);
        ~PageMiscellaneous();

    protected:  // Event Methoden
        void changeEvent(QEvent *event);

    private:    // Methoden

    public:     // Methoden

    signals:

    private slots:

    public slots:
    	void dialogOKClicked();
	void dialogApplyClicked();
	void dialogCancelClicked();

};
So wie ich es bis jetzt aufgebaut habe kann ich die Slots mit QObject::connect nicht erreichen. Geht das nur wenn ich die einzelnen Pages
jeweils mit einem eindeutigen Pointer erst erzeuge und dann die Slots verbinde?

Code: Alles auswählen

...
pageEnvironment = new PageEnvironment();
pageDatabase = new PageDatabase();
pageMiscellaneous = new PageMiscellaneous();

ui->tabOptionPages->addTab(pageEnvironment, tr("Environment"));
ui->tabOptionPages->addTab(pageDatabase, tr("Database"));
ui->tabOptionPages->addTab(pageMiscellaneous, tr("Miscellaneous"));

connect(buttonsDialog->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), pageEnvironment, SLOT(dialogOKclicked());
...
Ich würde mich freuen wenn mir jemand weiterhelfen könnte.

Grüße Netzschleicher

Re: Slots in QTabWidget Widgets erreichen

Verfasst: 12. Oktober 2016 14:48
von dacown
connect(this, SIGNAL(clicked(bool)), pageEnvironment, SLOT(dialogOKclicked());

so müsste es gehen wenn ich mich nicht irre.

Re: Slots in QTabWidget Widgets erreichen

Verfasst: 12. Oktober 2016 18:01
von Netzschleicher
Das ist ja genau das was ich zuletzt schon geschrieben habe.
Das ich zuerst die Instanzen alles OptionPages erzeuge,

Code: Alles auswählen

pageEnvironment = new PageEnvironment();
pageDatabase = new PageDatabase();
pageMiscellaneous = new PageMiscellaneous();
diese dann in das QTabWidget einfüge

Code: Alles auswählen

ui->tabOptionPages->addTab(pageEnvironment, tr("Environment"));
ui->tabOptionPages->addTab(pageDatabase, tr("Database"));
ui->tabOptionPages->addTab(pageMiscellaneous, tr("Miscellaneous"));
und dann entsprechend der Anzahl der Pages die Signale und Slots verbinde

Code: Alles auswählen

connect(buttonsDialog->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), pageEnvironment, SLOT(dialogOKclicked());
connect(buttonsDialog->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), pageDatabase, SLOT(dialogOKclicked());
connect(buttonsDialog->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), pageMiscellaneous, SLOT(dialogOKclicked());

connect(buttonsDialog->button(QDialogButtonBox::Cancel), SIGNAL(clicked(bool)), pageEnvironment, SLOT(dialogCancelclicked());
connect(buttonsDialog->button(QDialogButtonBox::Cancel), SIGNAL(clicked(bool)), pageDatabase, SLOT(dialogCancelclicked());
connect(buttonsDialog->button(QDialogButtonBox::Cancel), SIGNAL(clicked(bool)), pageMiscellaneous, SLOT(dialogCancelclicked());

connect(buttonsDialog->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), pageEnvironment, SLOT(dialogApplyclicked());
connect(buttonsDialog->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), pageDatabase, SLOT(dialogApplyclicked());
connect(buttonsDialog->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), pageMiscellaneous, SLOT(dialogApplyclicked());
aber genau das wollte ich mir ersparen und einfach nur

Code: Alles auswählen

connect(buttonsDialog->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), <alle Pages auf einmal>, SLOT(dialogOKclicked());
auch wollte ich wissen ob es auch ohne das ich erst sämtliche Pages Instanzieren muß funktioniert, also nach dem zuerst genannten Prinzip

Code: Alles auswählen

ui->tabOptionPages->addTab(new PageEnvironment(), tr("Environment"));
ui->tabOptionPages->addTab(new PageDatabase(), tr("Database"));
ui->tabOptionPages->addTab(new PageMiscellaneous(), tr("Miscellaneous"));
Mittlerweile habe ich mir einmal QSignalMapper angesehen. Damit müsste ich es zumindest dahingehend vereinfachen können das ich pro Page nur einen Slot benötige und in diesem dann evtl. mit switch..case unterscheiden kann von welchem Button das Singal kommt.

Re: Slots in QTabWidget Widgets erreichen

Verfasst: 13. Oktober 2016 08:40
von dacown
Da kann ich dir leider nicht weiter helfen.

Warum willst du das eigentlich verkürzen ?

Re: Slots in QTabWidget Widgets erreichen

Verfasst: 14. Oktober 2016 09:24
von hilefoks
Moin,

du könntest für deine Page Klassen eine gemeinsame Basisklasse erstellen, z.B.:

Code: Alles auswählen

class AbstractPage : public QWidget 
{
    Q_OBJECT
public:
    virtual QString title() const = 0;
    
public slots:
    virtual void dialogOKclicked() = 0;
    virtual void dialogCancelclicked() = 0;
    virtual void dialogApplyclicked() = 0;
};
Alle deine Page-Klassen leiten dann von dieser Klasse ab und implementieren die Methoden. Jetzt kannst du eine Methode wie diese implementieren:

Code: Alles auswählen

void MyClass::setupPage(AbstractPage *page) 
{
    ui->tabOptionPages->addTab(page, page->title());
    connect(buttonsDialog->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), page, SLOT(dialogOKclicked());
    connect(buttonsDialog->button(QDialogButtonBox::Cancel), SIGNAL(clicked(bool)), page, SLOT(dialogCancelclicked());
    connect(buttonsDialog->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), page, SLOT(dialogApplyclicked());
}
Jetzt musst du zum aufsetzen einer neuen Page nur noch folgendes schreiben:

Code: Alles auswählen

pageEnvironment = new PageEnvironment();
setupPage(pageEnvironment);
MfG
Hilefoks