Seite 1 von 1

[Qt Designer] pushBtn.clicked() mit myDlg.exec() verbinden

Verfasst: 10. September 2010 12:27
von rubikon
Moin.

Ich versuche mit Qt Creator / Qt Designer eine Anwendung zu erstellen.

Auf meinem von QMainWindow abgeleiteten Hauptfenster ist ein Button. Wenn dieser geklickt wird, soll ein Dialog geöffnet werden.

Dazu habe ich ein Member meiner Hauptfensterklasse hinzugefügt:

Code: Alles auswählen

MyApp::MyApp(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
        m_MyDlg = new MyDlg;
}

Code: Alles auswählen

class MyApp : public QMainWindow
{
	Q_OBJECT

...
...
private:
	Ui::MyAppClass ui;
        MyDlg* m_MyDlg;

Wie kann ich jetzt das Signal .clicked() des Buttons mit dem Slot .exec() des Dialogs verbinden?

Wenn ich im Qt Designer Singals & Slots hinzufügen möchte, komme ich bei Empfänger an MyDlg nicht dran.

Habe noch nicht viel Erfahrung mit Qt und dem entsprechen mit Signals uns Slots und bitte deswegen um Nachsicht. Leider konnte google mir bei dem Problem nicht helfen.

Vielen Dank

Verfasst: 10. September 2010 18:30
von PyCoder
Deklarier ne funktion in der Header Datei und implementier diese im Quelltext und verbinde dann das ganze mit Signal/Slot?


Beispiel aus meinem Prog:

Headerdatei:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <ui_mainwindow.h>

class kcrypt: public QMainWindow {
    Q_OBJECT
public:
    kcrypt();
    ~kcrypt() {};
private:
    Ui::mainWindow ui;
private slots:
    void create();
};

#endif // MAINWINDOW_H
Quelltext:

Code: Alles auswählen

#include <mainwindow.h>
#include <wizard.h>
#include <QAbstractButton>

kcrypt::kcrypt() {
   ui.setupUi(this);
   connect(ui.actionCreate_New_Luks_Volume, SIGNAL(triggered()), this,  SLOT(create()));
}

void kcrypt::create() {
    showWizard *wiz = new showWizard;
    wiz->exec();
}

Hoff das hilft dir weiter :)

Verfasst: 11. September 2010 09:14
von solarix
Und damit hast nun gleich ein Speicherleck erzeugt.

Besser ist:

Code: Alles auswählen

kcrypt::kcrypt() {
   ...
   m_MyDlg = new MyDlg; 
}

kcrypt::~kcrypt() {
   delete m_MyDlg;
}
void kcrypt::create() {
     m_MyDlg->exec();
}

------------------------------------------------------
oder
kcrypt::kcrypt() {
   ...
   m_MyDlg = new MyDlg(this); 
}

void kcrypt::create() {
     m_MyDlg->exec();
}

------------------------------------------------------
oder

void kcrypt::create() {
    showWizard wiz;
    wiz.exec(); 
}

------------------------------------------------------
oder
class MyApp : public QMainWindow
{
   ...
private:
        MyDlg m_MyDlg; 
...

void kcrypt::create() {
    m_MyDlg.exec(); 
}


hth...

Verfasst: 11. September 2010 20:39
von PyCoder
Das mischen ist eher verwirrend.

Naja bei PyQt muss ich mich nicht um Memoryleaks kümmern ^^

Verfasst: 11. September 2010 21:38
von franzf
PyCoder hat geschrieben:Das mischen ist eher verwirrend.

Naja bei PyQt muss ich mich nicht um Memoryleaks kümmern ^^
Viele Wege führen nach Rom. In C++ hast du glücklicherweise die Wahl des besten Weges.
Und du kannst mit PyQt4 auch schöne MemoryLeaks zaubern - wenn du einen entsprechenden Bug in dein Binding einbaust.
Du hast halt in C++ keine Referenzzählung - einfach weil sowas immer Performance kostet! Brauchst du Referenzzählung mit automatischer Zerstörung, dann nimmst du einen entsprechenden SharedPtr. Man muss sich nur überlegen wer den ptr besitzt.

Python zu wählen, nur weil es keine (so leichten) MemoryLeaks gibt ist unsinnig. Ich z.B. vermisse bei Python die klare Typisierung von C++, und programmier dafür lieber mit dem Leakenden C++.

Verfasst: 12. September 2010 20:38
von PyCoder
franzf hat geschrieben: Python zu wählen, nur weil es keine (so leichten) MemoryLeaks gibt ist unsinnig.
Hab nie gesagt das ich PyQt nutze nur weil man keine (so leichten) MemoryLeaks erzeugen kann, dass wäre höchstens einer von vielen Gründen.

Für mich ist PyQt die bessere Lösung da ich schneller zum Ziel komme und massig Tippen erspare, durch "einfacheren Syntax", durch fehlende Headerdateien bzw Deklarationen usw usf.


Ist ja auch wurst und gehört hier nicht hin ;)

C ya

Verfasst: 13. September 2010 08:27
von rubikon
Ja, okay. Mit dem 'Umweg' über einen weiteren selbst erzeugten Dlot habe ich das auch schon hinbekommen.

Aber ich dachte es gibt evtl. eine Möglichkeit das .clicked() Signal irgendwie direkt mit dem .exec() Slot zu verbinden.

Das geht also nicht?!?

Verfasst: 13. September 2010 08:47
von padreigh
connect(button,SIGNAL(clicked()),myDiag,SLOT(exec())); ?

Das Problem sehe ich eher darin zB den returnwert des Dialogs dann zu bekommen ... aber du hast den Dialog ja eh abgeleitet also kannst du dann ja auch das "dialog-zuende" signal abfangen und dahin leiten wo du den return wert evtl brauchst ...