2016-01-30 3 views
1

Я разрабатываю приложение с Qt на встроенной Linux. Плагин платформы - EGLFS.Почему QWidget не отображается, если он установлен как родительский?

Основная часть приложения:

QApplication a(argc, argv); 

MainWindow mainWindow; 

CentralWidget centralWidget(&mainWindow); 
centralWidget.setObjectName("centralWidget"); 
centralWidget.setStyleSheet("CentralWidget#centralWidget {background-color: red;}"); 
centralWidget.setGeometry(50, 50, 500, 500); 

mainWindow.show(); 

return a.exec(); 

MainWindow это класс, который наследует QMainWindow, CentralWidget это класс, который наследует QWidget. Реализации строителей MainWindow и CentralWidget являются:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {} 
CentralWidget::CentralWidget(QWidget *parent) : QWidget(parent) {} 

При запуске приложения я заметил, что CentralWidget никогда не показывается. Я пробовал без успеха заставить шоу CentralWidget, но ничего не происходит.

Является ли мой код неправильным или я столкнулся с ошибкой?

ответ

1

Чтобы виджет отображался внутри QMainWindow, вы должны установить его как центральный виджет, используя QMainWindow::setCentralWidget. MainWindow сама состоит из нескольких частей, и тот, который вы хотите, чтобы заполнить это «Центральный виджет»:

Чтобы сделать это, просто вызовите

mainWindow.setCentralWidget(&centralWidget); 

, прежде чем показать окно и он должен работать. (Обратите внимание, что установка геометрии на центральном виджета не будет работать, она будет изменена до mainWindow. Измените ее вместо этого).

Если вы не хотите, чтобы заменить центральный виджет, а добавить новый ребенок к ней, все, что вам нужно сделать, это изменить родительские виджеты для центрального виджета (вместо самого MainWindow):

CentralWidget centralWidget(mainWindow.centralWidget()); 

Обратите внимание: центральный виджет должен быть установлен ранее, в противном случае возвращается NULL. Так как ваш MainWindow является настраиваемым классом, вы, возможно, уже имеете центральный виджет. Если нет, и вы просто хотите пустой контейнер, заполнить его с простым QWidget перед использованием:

mainWindow.setCentralWidget(new QWidget());//No parent required, QMainWindow takes ownership 
CentralWidget centralWidget(mainWindow.centralWidget()); 

(Изображение взято из: https://doc.qt.io/qt-5/qmainwindow.html#details)

+1

Я уже пытался установить CentralWidget в качестве центрального виджета MainWindow, но ничего не происходит. К несчастью, проблема, похоже, связана с ограничением EGLFS. См. Мой ответ ниже. Спасибо за ваше время – Grynium

0

Проблема связана с платформы плагин EGLFS. Из документов Qt:

С Qt 5.3, eglfs поддерживает один, полноэкранное окно GL (например, OpenGL на основе QWindow, A QQuickView или QGLWidget). Открытие дополнительных окон OpenGL или смешивание таких окон с содержимым на основе QWidget не поддерживается и завершает работу приложения с сообщением об ошибке.

Ссылка: http://doc.qt.io/qt-5/embedded-linux.html#eglfs

Поэтому открытие дополнительных окон, смешанных с QWidget, на основе содержимого не поддерживается.

Смежные вопросы