Qt4:将QMainWindow实例放在其他QWidget / QMainWindow中

时间:2011-06-14 14:12:17

标签: qt qt4 qt-creator qwidget qmainwindow

我想将QMainWindow实例放在另一个QWidget中(例如另一个QMainWindow的centralWidget)。

我想知道它为什么不起作用? QMainWindow直接从QWidget继承。将QWidget放在另一个QWidget中可以正常工作。

我经常将QMainWindow实例放在QTabBar中而没有任何问题。

ps您可能会问为什么我需要使用QMainWindow?我想使用垂直布局在1个表单中放置2个小部件。我希望这两个小部件直接在它们上面分别使用工具栏。

也许有其他方法可以使用QtCreator将工具栏放在普通的QWidgets中?


修改

第一个例子(正常工作)

我基于QWidget创建新的类/表单。 (QtCreator根据标准模板创建3个文件* .cpp,* .h和* .ui。)

类声明看起来像这样

class NotesEditor : public QWidget
{
    Q_OBJECT

public:
    explicit NotesEditor(QWidget *parent = 0);
    ~NotesEditor();

private:
    Ui::NotesEditor *ui;
};

当我尝试使用此小部件并将其放在另一个小部件中时,它可以正常工作。 我使用了qtcreator的“promote to ...”功能 - 这里没有问题。

第二个例子(不起作用)

我基于QMainWindow创建新的类/表单。 (QtCreator根据标准模板创建3个文件* .cpp,* .h和* .ui。)

类声明如下所示:

class Notes : public QMainWindow
{
    Q_OBJECT

public:
    explicit Notes(QWidget *parent = 0);
    ~Notes();

private:
    Ui::Notes *ui;
};

现在,当我尝试将此小部件放在另一个小部件中时,它不可见。 和之前一样,我使用了qtcreator的“promote to ...”功能。

两个小部件(首先基于QWidget,第二个基于QMainWindow)具有基于标准qtcreator代码模板的相同默认结构。我在这里没有太大变化 - 只是在表单设计器中添加了一些按钮。

在第二个例子中,我尝试在类实例上使用setEnabled(true)和setVisible(true)。第一个没有结果。第二个在单独的窗口中打开这个小部件。


我认为最大的问题是QMainWindow是否会嵌套在另一个QWidget中。正如我在QMainWindow之前写的那样,实例可以毫无问题地放在QTabWidgets中。

3 个答案:

答案 0 :(得分:12)

遇到同样的问题,我找到了解决方案here

QMainWindow将其窗口类型设置为Qt :: Window,即使它有一个父窗口它也会在一个独立的窗口中(你可以通过调用QMainWindow上的show()来确认它,你会看到它自己的窗口)。尝试添加行

window->setWindowFlags(Qt::Widget);
构建QMainWindow之后

答案 1 :(得分:3)

centralwidget = new QMainWindow(this);
centralwidget->setWindowFlags(Qt::Widget);
setCentralWidget(centralwidget);

这应该有所帮助。

答案 2 :(得分:-3)

QMainWindow以平台无关的方式提供工具栏,状态栏和菜单栏等预定义的东西(它“做正确的事情”,无需人工干预)。如果你需要的只是布局中的一堆按钮,请使用QWidget

你需要确保每个QMainWindow has central QWidget`,除此之外,你应该没事。