Slots in QTabWidget Widgets erreichen

Alles rund um die Programmierung mit Qt
Antworten
Netzschleicher
Beiträge: 11
Registriert: 24. Juli 2013 12:59

Slots in QTabWidget Widgets erreichen

Beitrag 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
dacown
Beiträge: 15
Registriert: 21. März 2016 17:10

Re: Slots in QTabWidget Widgets erreichen

Beitrag von dacown »

connect(this, SIGNAL(clicked(bool)), pageEnvironment, SLOT(dialogOKclicked());

so müsste es gehen wenn ich mich nicht irre.
Netzschleicher
Beiträge: 11
Registriert: 24. Juli 2013 12:59

Re: Slots in QTabWidget Widgets erreichen

Beitrag 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.
dacown
Beiträge: 15
Registriert: 21. März 2016 17:10

Re: Slots in QTabWidget Widgets erreichen

Beitrag von dacown »

Da kann ich dir leider nicht weiter helfen.

Warum willst du das eigentlich verkürzen ?
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Slots in QTabWidget Widgets erreichen

Beitrag 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
Antworten