我有一个
ui
,还有一个 QPushButton
和一个 QLabel
。我希望每当我按下该按钮时,QLabel
都能在我的笔记本电脑上全屏显示。
我尝试了以下代码:
void MainWindow::on_fullScreenBtn_clicked()
{
// ui->myImage is a QLabel*
ui->myImage->setText("going full screen");
ui->myImage->showMaximized();
ui->myImage->QWidget::showFullScreen();
}
我可以看到这个函数被执行,但它没有全屏显示我的标签。我做错了什么/遗漏了什么?
我正在使用 Qt Creator 3.5.1 并使用内置图形界面制作 GUI。
问题是您的
QLabel
是另一个小部件的一部分,因此由于默认的 Qt::Widget
标志而显示为子小部件:
这是
的默认类型。 如果这种类型的小部件有父级,则它们是子小部件,并且 独立窗口(如果没有父窗口)。另请参阅QWidget
和Qt::Window
Qt::SubWindow.
因此,解决方案是手动将标志更改为
Qt::Window
,如下所示:
ui->myImage->setWindowFlag(Qt::Window);
Qt 5.9 之前的用户可以使用以下功能:
ui->myImage->setWindowFlags(ui->myImage->windowFlags() | Qt::Window);
请注意,您应该在更改窗口标志后调用
showFullScreen
,如 Qt 记录的 :
注意:当更改某个对象的标志时,该函数会调用 setParent() 窗口,导致小部件被隐藏。您必须调用 show() 才能使 小部件再次可见..
撤消最大化
应删除窗口标志以撤消最大化。这可以按如下方式完成:
ui->myImage->setWindowFlag(Qt::Window, false);
ui->myImage->show();
Qt 5.9 之前的用户可以使用以下功能:
ui->myImage->setWindowFlags(ui->myImage->windowFlags() & ~Qt::Window);
ui->myImage->show();
请注意,如上所述,需要调用
show
。
不有父级(是实际的窗口,不包含窗口小部件)。所以你的代码中有一些不同的选项。
1 - 仅使用您的 QLabel 创建 QStackedLayout 或 QStackedWidget,当您触发插槽时,请执行以下操作:
void MainWindow::on_fullScreenBtn_clicked()
{
ui->stackedWidget->setCurrentIndex( indexOfTheLabel);
}
2 - 您还可以删除 QLabel 的父级,但这会产生复杂的混乱,所以不要这样做。
void MainWindow::on_fullScreenBtn_clicked()
{
ui->myImage->setParent(nullptr);
ui->myImage->setText("going full screen");
ui->myImage->showMaximized();
ui->myImage->showFullScreen();
}
不要做第二个。
您是否在 main 函数中调用 MainWindow 实例上的 show() 方法?类似这样的东西:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow window;
window.showMaximized();
return a.exec();
}