我怎样才能拥有QMainWindow的UI?

时间:2009-05-14 07:10:20

标签: qt user-interface

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我想我现在明白了。

你有一个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中所做的每一项更改都不需要更改主窗口。问题是我不确定在widget的构造函数以外的地方调用setupUi是否合法,所以你必须检查(通过查看setupUi函数中发生的事情)。

答案 3 :(得分:0)

如果我做对了,我想你可能想在style sheets抓一个战利品。它允许你为你的小部件设置“皮肤”,就像CSS一样。

如果我没有做到这一点,你想要做的是动态生成.ui文件并使用QUiLoader创建小部件,那么你可能会以错误的方式去做,因为我可以我认为常规应用需要这个原因。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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