Я думаю, что получил это сейчас.
У вас есть 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).