如何在QDialog中显示QMainWindow

时间:2017-02-21 11:07:36

标签: c++ qt

我试图在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,主窗口将显示在另一个窗口中。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

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

我的建议是将所有MainWindow实现以单独的形式(继承QWidget),并使用类似p_MainWindow->setCentralWidget(p_YourNewForm);

之类的内容将该表单添加到构造函数中的MainWindow中

答案 2 :(得分: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.
}