2017-02-21 3 views
0

Ich versuche, ein QMainWindow in einem QDialog anzuzeigen, aber ersteres erscheint nicht.So zeigen Sie ein QMainWindow in einem QDialog

ich subclassed QDialog haben, machen wir es

myDialog nennen

ein kleines Beispiel:

myDialog(QWidget *p_parent) : QDialog(p_parent) 
{ 
    QGridLayout *p_dialogLayout = new QGridLayout(this); 

    QMainWindow *p_MainWindow = new QMainWindow(this); 
    QLabel *p_label = new QLabel(this); 
    p_MainWindow->setCentralWidget(p_label); 

    QPushButton *p_cancel = new QPushButton("Cancel", this); 

    p_dialogLayout ->addWidget(p_MainWindow, 0, 0); 
    p_dialogLayout ->addWidget(p_cancel, 1, 0); 
} 

Wenn ich den Dialog ausführen, ich den Knopf nur sehen, nicht die eingebettete QMainWindow. Wenn ich zwinge das qmainwindow zu zeigen, wird das Hauptfenster in einem anderen Fenster angezeigt.

+1

'QMainWindow' ist eine Klasse für das Hauptfenster Ihrer Anwendung, warum möchten Sie sie in einem Dialog platzieren? – SingerOfTheFall

+0

@pablo_worker Finden Sie heraus, wie sie es in Qt Designer tun. – LogicStuff

+0

Ich möchte ein qmainwindow platzieren, um eine Symbolleiste hinzuzufügen. @SingerOfTheFall –

Antwort

0

Ich habe in der Lage, es zu tun.

Der Trick ist, die QMainWindow ohne einen Elternteil zu konstruieren, und wenden Sie dann die .setParent

Hier ist, wie:

myDialog(QWidget *p_parent) : QDialog(p_parent) 
{ 
    QGridLayout *p_dialogLayout = new QGridLayout(this); 

    QMainWindow *p_MainWindow = new QMainWindow(); //Without a parent 
    QLabel *p_label = new QLabel(this); 
    p_MainWindow->setCentralWidget(p_label); 

    QPushButton *p_cancel = new QPushButton("Cancel", this); 

    p_dialogLayout ->addWidget(p_MainWindow, 0, 0); 
    p_dialogLayout ->addWidget(p_cancel, 1, 0); 

    p_MainWindow->setParent(this); //Set the parent, to delete the MainWindow when the dialog is deleted. 
} 
0

Ich glaube nicht, dass dies von der Qt-Framework unterstützt wird, nach ihrer Dokumentation von here, es soll nur einmal in einer Anwendung verwendet werden.

Mein Vorschlag wäre, alle Implementierung Ihrer Hauptfenster in einem separaten Formular zu übernehmen (erben QWidget), und fügen Sie einfach dieses Formular zu Ihrem Mainwindow im Konstruktor mit so etwas wie p_MainWindow->setCentralWidget(p_YourNewForm);

3

Verwenden QLayout::setMenuBar eine Symbolleiste auf Ihren Dialog hinzuzufügen.

#include <QtWidgets> 

class Dialog : public QDialog 
{ 
    Q_OBJECT 
public: 
    Dialog(QWidget *parent = nullptr) : QDialog(parent) 
    { 
     resize(600, 400); 
     setLayout(new QHBoxLayout); 
     QToolBar *toolbar = new QToolBar; 
     toolbar->addAction("Action one"); 
     toolbar->addAction("Action two"); 
     layout()->setMenuBar(toolbar); 

     layout()->addWidget(new QLabel("Label one")); 
     layout()->addWidget(new QLabel("Label two")); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Dialog w; 
    w.show(); 

    return a.exec(); 
} 

#include "main.moc" 
+0

Danke! Ich wusste nichts von dieser Option. Ein wenig nicht, sollte nicht neu sein QToolBar (this)? Um es automatisch zu löschen. setMenuBar() gibt nicht an, dass es Besitz übernimmt. –

+1

@pablo_worker Sie können 'this' als Eltern übergeben, aber' setMenuBar' wird dies automatisch tun. Ich weiß, weil ich den [Quellcode] überprüft habe (https://code.woboq.org/qt5/qtbase/src/widgets/kernel/qlayout.cpp.html#_ZN7QLayout10setMenuBarEP7QWidget). – thuga

Verwandte Themen