Qt4: размещение экземпляра QMainWindow внутри другого QWidget / QMainWindow - PullRequest
7 голосов
/ 14 июня 2011

Я бы хотел разместить экземпляр QMainWindow внутри другого QWidget (например, centralWidget другого QMainWindow).

Мне интересно, почему это не работает? QMainWindow наследуется непосредственно от QWidget. Размещение QWidget внутри другого QWidget работает нормально.

Я часто помещаю экземпляры QMainWindow в QTabBar без каких-либо проблем.

ps Вы можете спросить, зачем мне использовать QMainWindow? Я хочу разместить 2 виджета внутри 1 формы, используя вертикальное расположение. Я хочу, чтобы оба виджета имели отдельные панели инструментов прямо над ними.

Может быть, есть какой-то другой способ разместить панели инструментов внутри простых QWidgets, используя QtCreator?


Редактировать

Первый пример (работает нормально)

Я создаю новый класс / форму на основе QWidget. (QtCreator создает 3 файла * .cpp, * .h и * .ui на основе стандартных шаблонов).

Объявление класса выглядит следующим образом

class NotesEditor : public QWidget
{
    Q_OBJECT

public:
    explicit NotesEditor(QWidget *parent = 0);
    ~NotesEditor();

private:
    Ui::NotesEditor *ui;
};

Когда я пытаюсь использовать этот виджет и поместить его в другой виджет, он работает нормально. Я использовал функцию "повысить до ..." в qtcreator - здесь нет проблем.

Второй пример (не работает)

Я создаю новый класс / форму на основе QMainWindow. (QtCreator создает 3 файла * .cpp, * .h и * .ui на основе стандартных шаблонов).

Объявление класса выглядит так:

class Notes : public QMainWindow
{
    Q_OBJECT

public:
    explicit Notes(QWidget *parent = 0);
    ~Notes();

private:
    Ui::Notes *ui;
};

А теперь, когда я пытаюсь разместить этот виджет в другом виджете, его не видно. Так же, как и раньше, я использовал функцию "повысить до ..." qtcreator.

Оба виджета (первый на основе QWidget, второй на основе QMainWindow) имеют одинаковую структуру по умолчанию на основе стандартных шаблонов кода qtcreator. Я не сильно изменился здесь - просто добавил несколько кнопок в дизайнере форм.

Во втором примере я пытался использовать setEnabled (true) и setVisible (true) для экземпляра класса. Первый не дает результатов. Второй открывает этот виджет в отдельном окне.


Я думаю, что большой вопрос в том, что вероятнее всего QMainWindow будет вложен в другой QWidget. Как я писал ранее, экземпляры QMainWindow могут быть размещены внутри QTabWidgets без каких-либо проблем.

Ответы [ 3 ]

12 голосов
/ 08 августа 2012

Имея ту же проблему, я нашел решение здесь .

QMainWindow устанавливает свой тип окна в Qt :: Window, чтобы он находился в независимом окне, даже если у него есть родительский элемент (вы можете подтвердить это, вызвав show () в вашем QMainWindow, и вы увидите его в своем собственном окне). окно). Попробуйте добавить строку

window->setWindowFlags(Qt::Widget);

после создания QMainWindow.

3 голосов
/ 22 февраля 2012
centralwidget = new QMainWindow(this);
centralwidget->setWindowFlags(Qt::Widget);
setCentralWidget(centralwidget);

Это должно помочь.

0 голосов
/ 14 июня 2011

QMainWindow предоставляет предопределенные вещи, такие как панели инструментов, строки состояния и строки меню, независимо от платформы (это «делает правильно», без ручного вмешательства).Если все, что вам нужно, это набор кнопок в макете, используйте QWidget.

. Вы должны убедиться, что каждый QMainWindow has central QWidget`, кроме этого, у вас все будет в порядке.

...