我有一个QGLWidget作为我的应用程序UI的一部分。它是不是一个中心小部件,周围有很多其他小部件。我想在用户点击按钮时全屏显示。类似于youtube视频flash播放器的功能
我已经尝试使用showFullScreen没有效果。
我已经阅读了how-to-fullscreen-a-qglwidget和fullscreen-widget,但他们建议使用showFullScreen。
Qt文档说明使用showFullScreen小部件必须是一个独立的窗口。我想这里应该有一些技巧。
我找到了解决方案:
void MyApp::on_fullscreen_button_clicked() {
QDialog *dlg = new QDialog(this);
QHBoxLayout *dlg_layout = new QHBoxLayout(dlg);
dlg_layout->setContentsMargins(0, 0, 0, 0);
dlg_layout->addWidget(glwidget_);
dlg->setLayout(dlg_layout);
dlg->showFullScreen();
bool r = connect(dlg, SIGNAL(rejected()), this, SLOT(showGlNormal()));
assert(r);
r = connect(dlg, SIGNAL(accepted()), this, SLOT(showGlNormal()));
assert(r);
}
void MyApp::showGlNormal() {
ui.glBox->layout()->addWidget(glwidget_);
}
showFullScreen函数只适用于windows。来自Qt文档:
窗口是一个小部件,它在视觉上不是任何其他小部件的子部件它通常有一个框架和一个窗口标题
一个可能的解决方案如下:
当用户点击全屏显示按钮
- 创建一个新的QGlWidget,没有父,并将QGlWidget 的内容设置为它使用showFullScreen功能
也许创建QGlWidget的子类并在其构造函数中传递指向另一个QGlWidget的指针是一个更好的主意。构造函数应该接受所提供小部件的上下文,并将其应用于新小部件。
- 在子类中捕获键盘事件。当用户按Esc发出一个信号在你的基类中捕获这个信号并将它连接到一个插槽。在此槽中隐藏全屏QGlWidget并删除它。