2017-02-21 30 views
0

我想在QDialog中显示QMainWindow,但前者不显示。如何在QDialog中显示QMainWindow

我有子类QDialog的,我们称之为myDialog

一个小例子:

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); 
} 

如果我执行的对话框中,我只看到按钮,而不是嵌入式的QMainWindow。 如果我强制显示qmainwindow,主窗口会显示在另一个窗口中。

+1

'QMainWindow'是您的应用程序主窗口的类,您为什么要将它放在对话框中? – SingerOfTheFall

+0

@pablo_worker了解他们如何在Qt Designer中做到这一点。 – LogicStuff

+0

我想放置一个qmainwindow来添加一个工具栏。 @SingerOfTheFall –

回答

0

我已经能够做到这一点。

关键是要构建的QMainWindow没有父母,然后应用.setParent

方法如下:

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

根据他们的文档here,我不认为这是Qt框架支持的,它只能在应用程序中使用一次。

我的建议是采取在一个单独的形式所有的主窗口实现(继承QWidget),只是添加表格到你的主窗口中使用的东西构造类似p_MainWindow->setCentralWidget(p_YourNewForm);

3

使用QLayout::setMenuBar工具栏添加到您的对话框。

#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

谢谢!我不知道这个选择。有一点不是,不应该是新的QToolBar(这个)?自动删除它。 setMenuBar()不声明它拥有所有权。 –

+1

@pablo_worker您可以将'this'作为父项,但'setMenuBar'会自动完成。我知道,因为我检查了[源代码](https://code.woboq.org/qt5/qtbase/src/widgets/kernel/qlayout.cpp.html#_ZN7QLayout10setMenuBarEP7QWidget)。 – thuga

相关问题