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