Как я могу иметь больше, чем пользовательский интерфейс для QMainWindow? - PullRequest
3 голосов
/ 14 мая 2009

Я хотел бы иметь QMainWindow, которое может изменить его внешний вид во время выполнения, то есть когда пользователь нажимает кнопку. Помимо хранения ссылок на различные классы пользовательского интерфейса, сгенерированные QtDesigner, есть ли другой способ сделать это? Может быть, сохраняя каждый пользовательский интерфейс в макете? Что ты думаешь?

Ответы [ 6 ]

5 голосов
/ 14 мая 2009

Какую часть главного окна вы хотите изменить? Вы можете использовать QStackWidget в любом месте, где хотите что-то изменить, и изменять отображаемую страницу виджета при нажатии кнопки. Это будет быстро изменить, но для больших или сложных пользовательских интерфейсов он может быть немного медленнее при запуске, так как он будет создавать виджеты для обоих пользовательских интерфейсов одновременно. (Существуют также довольно простые способы изменить это, но они добавляют сложности к чему-то, что может быть простым для большинства людей.) Кроме того, если оба макета должны иметь одинаковые данные, просто в разных местах, у вас есть дополнительные накладные расходы поддержание обоих наборов пользовательских интерфейсов в актуальном состоянии во время работы программы.

1 голос
/ 14 мая 2009

Я думаю, что получил это сейчас.

У вас есть 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).

1 голос
/ 14 мая 2009

Вы можете динамически загружать макеты пользовательского интерфейса во время выполнения. Проверьте документацию Qt для класса QUiLoader.

Это также позволяет обновлять макеты пользовательского интерфейса без изменения одной строки кода.

0 голосов
/ 30 марта 2015

Вы можете использовать QTabWidget и скрыть его кнопки. Затем вы можете создать каждый графический интерфейс в отдельном окне tabWidget. Он имеет преимущество перед скрытием фреймов, так как вы не будете загромождать окно Qt Creator.

0 голосов
/ 29 ноября 2013

То, что я делаю, - это проектирование двух пользовательских интерфейсов под двумя разными QFrames, размещение двух QFrames в макете вместе в QMainWindow, а затем скрытие () и show () нужного QFrame, который вы хотите ...

0 голосов
/ 14 мая 2009

Если я правильно понял, я думаю, что вы могли бы взять лут на таблицах стилей . Это позволяет вам иметь «скины» для ваших виджетов, так же, как CSS.

Если я не понял это правильно, и вы пытаетесь сгенерировать файлы .ui на лету и создавать виджеты с теми, которые используют QUiLoader, то вы, вероятно, поймете это неправильно, так как я могу Не думаю, что для этого нужно обычное приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...