对于 QMainWindow,我如何才能拥有更多的 UI?

Posted

技术标签:

【中文标题】对于 QMainWindow,我如何才能拥有更多的 UI?【英文标题】:how can I have more than a UI for a QMainWindow? 【发布时间】:2009-05-14 07:10:20 【问题描述】:

我想要一个 QMainWindow 可以在运行时改变它的外观,即当用户点击一个按钮时。除了保留对 QtDesigner 生成的不同 UI 类的引用之外,还有其他方法吗?也许通过将每个 UI 存储在布局中?你怎么看?

【问题讨论】:

【参考方案1】:

您要更改多少主窗口?您可以在任何想要更改内容的地方使用QStackWidget,并在按下按钮时更改小部件的显示页面。这将很快改变,但对于大型或复杂的 UI,它在启动时可能会稍微慢一些,因为它将同时为两个 UI 创建小部件。 (也有相当简单的方法可以改变这一点,但它们确实增加了对大多数人来说可能很简单的事情的复杂性。)另外,如果两个布局应该有相同的数据,只是在不同的地方,你会有额外的开销在程序运行时保持两组 UI 都是最新的。

【讨论】:

我想改变所有的用户界面。将它们视为完全不同的屏幕,具有相同的窗口尺寸(宽度/高度)【参考方案2】:

我想我现在明白了。

你有一个 QMainWindow,当某个事件被触发时,你想改变那个特定窗口的外观,比如删除一些按钮,添加一个树视图小部件等等。

直接的方法是手动完成,删除一些小部件并使用常规 C++ 代码添加新小部件。如果您习惯了 Qt Designer,这可能会有点困难。

我能想到的另一种方法是使用 Qt Designer 生成其他外观的代码并将其复制到特殊函数中。 Qt Designer 生成的代码通常位于名为“ui_classname.h”的头文件中,并不难理解。但是,您需要删除其中的一些,因为并非全部都是必需的。

另外,您可以直接调用它,而不是从 Qt Designer 复制生成的代码。通常,您的小部件有一个指向生成的类的指针,并且在您的小部件的构造函数中,您会看到如下内容:

MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MyWindow)

    m_ui->setupUi(this);

并在对应的头文件中:

class MyWindow : public QMainWindow 
...
private:
    Ui::MyWindow *m_ui;
;

您可以为其他外观添加额外生成的类,并在您的事件触发时使用它们。

它可能看起来像这样:

class MyWindow : public QMainWindow 
...
private:
    void changeAppearance(int id);

    Ui::MyWindow *m_ui;
    Ui::MyWindowFirstAppearance *m_uiFirst;
    Ui::MyWindowSecondAppearance *m_uiSecond;
...
;

void MyWindow::changeAppearance(int id)

     // some code to remove the current appearance, basically the opposite of what setupUi is doing
     if (id == 0)
           m_ui->setupUi(this);
     else...
           m_uiFirst->setupUi(this);
     ...

这具有直接使用生成的类的好处,因此您在 Qt Designer 中所做的每项更改都不需要更改您的主窗口。问题是我不确定在小部件的构造函数之外的地方多次调用 setupUi 是否合法,所以你必须检查一下(通过查看 setupUi 函数中发生的情况)。

【讨论】:

是的,这是我目前使用的方法,问题是您需要保留对外观的引用。谢谢!【参考方案3】:

您可以在运行时动态加载 UI 布局。检查Qt documentation 获取 QUiLoader 类。

这还使您无需修改​​一行代码即可升级 UI 布局。

【讨论】:

这是一个解决方案,但速度很慢。你能想到其他方法来实现这一点吗? 很遗憾没有。您可以随时在 qtcentre.org 上提问。【参考方案4】:

我所做的是在两个不同的QFrame下设计两个UI,将两个QFrame放在一个布局中,放在QMainWindow中,然后hide()和show()你想要的正确的QFrame...

【讨论】:

【参考方案5】:

您可以使用QTabWidget 并隐藏其按钮。然后,您可以在tabWidget 的单独窗口中设计每个 GUI。与隐藏框架相比,它的优势在于不会弄乱 Qt Creator 窗口。

【讨论】:

【参考方案6】:

如果我做对了,我想你可能想在style sheets 上抢夺一宝。它允许您为小部件创建“皮肤”,就像 CSS 一样。

如果我没有做对,而您正在尝试动态生成 .ui 文件并使用 QUiLoader 创建小部件,那么您可能会走错路,因为我可以'想不出一个普通应用程序需要它的充分理由。

【讨论】:

将其视为某种选项卡式窗格。只是我必须在同一个选项卡中显示不同的 UI。 如果我理解正确,在 #1 选项卡中您选择了一些复选框,并且下一个选项卡的内容会发生变化。 在这种情况下,QWizard 听起来很合适。

以上是关于对于 QMainWindow,我如何才能拥有更多的 UI?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能给eclipse比512M更多的内存?

汇新云丨如何才能提高品牌影响力?

QT中将QWidget提升为QMainWindow

如何从父级不是 QMainWindow 的 QWidget 访问 QMainWindow

如何在 QMainWindow 中创建菜单栏

如何将 QMainWindow 调整大小事件传递给 QMainWindow 中包含的 QGLWidget?