8

我想将 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 的“提升到...”功能 - 这里没有问题。

第二个例子(不起作用)

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

类声明如下所示:

class Notes : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::Notes *ui;
};

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

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

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


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

4

3 回答 3

14

遇到同样的问题,我在这里找到了解决方案。

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

window->setWindowFlags(Qt::Widget);

在构建 QMainWindow 之后。

于 2012-08-08T08:14:34.170 回答
3
centralwidget = new QMainWindow(this);
centralwidget->setWindowFlags(Qt::Widget);
setCentralWidget(centralwidget);

这应该会有所帮助。

于 2012-02-22T06:49:43.797 回答
-3

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

你需要确保每个QMainWindow has centralQWidget`,除此之外,你应该没问题。

于 2011-06-14T14:32:29.627 回答