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

Alles rund um die Programmierung mit Qt
Antworten
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

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

Beitrag 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
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag 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 :)
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag von PyCoder »

Das mischen ist eher verwirrend.

Naja bei PyQt muss ich mich nicht um Memoryleaks kümmern ^^
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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++.
PyCoder
Beiträge: 18
Registriert: 4. April 2010 08:35

Beitrag 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
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

Beitrag 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?!?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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 ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten