Qt启动时全屏

32

我想根据以下设置(MacOS 10.8.x,Qt 5.1.1,C++),在全屏模式下启动应用程序:

main.cpp

#include "MainWindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.showFullScreen();

    return a.exec();
}

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

设置行为非常完美,像魔法一样工作。但是this-> showFullScreen() 做了一些非常丑陋的事情:

  1. 全屏显示窗口
  2. 在中心以正常大小显示窗口
  3. 将窗口缩放到全屏

如何避免这种情况?


你尝试过调用 setWindowFlags(Qt::Window | Qt::WindowFullScreen | Qt::Customize) 吗? - TheDarkKnight
1
@Merlin069 错误:无法将“unsigned int”转换为“Qt::WindowFlags”(又名“QFlags<Qt :: WindowType>”) - Thomas Ayoub
尝试在构造函数之后调用showFullScreen(在main()或创建mainwindow的任何地方)。 - Frank Osterfeld
@FrankOsterfeld 也不行 - Thomas Ayoub
@hyde 很不幸… - Thomas Ayoub
显示剩余14条评论
8个回答

28

如果您想让应用程序以最大化窗口打开,请使用以下内容:

Mainwindow w;
w.setWindowState(Qt::WindowMaximized);
w.show();

如果您想将应用程序作为全屏窗口打开,请使用以下内容:

Mainwindow w;
w.setWindowState(Qt::WindowFullScreen);
w.show();

2
简洁的替代方法是 w.showMaximized()w.showFullScreen() - Matt Eding

24

我已经遇到了这个问题,一个非常好的解决方案是通过延迟一秒钟来切换全屏(使用 QTimer):

我曾经面临过这个问题,一个非常好的解决办法是延迟一秒钟后再进行全屏切换(使用 QTimer ):

QTimer::singleShot(0, this, SLOT(showFullScreen()));

13

您可以在构造函数中尝试QMainWindow::showFullScreen()

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMainWindow::showFullScreen();
}

我应该在哪里添加这部分?你能再解释一下吗?谢谢。 - Yamur
@Yamur他的代码引用了ui->setupUi(),因此应该在构造函数中。我相应地更新了答案,以使其清晰明了,特别是因为我认为这是最好(最干净)的解决方案。 - Alexis Wilke

7

您可以使用QWidget状态来实现。请参考Qt文档:QWidget::setWindowState

将应用程序全屏的方法如下:

MainWindow w;    
w.setWindowState(w.windowState() ^ Qt::WindowFullScreen);

谢谢


1
运行得非常好。虽然我不使用任何^,只需在我的MainWindow类的构造函数中执行this->setWindowState(Qt::WindowFullScreen),它就可以立即全屏。使用QTimer的问题是,即使将其设置为1,您仍然可以看到窗口最大化,以便它可以进入全屏模式,这实际上看起来并不好。 - rbaleksandar

2

我正在使用QWidget作为我的主窗口,但是我通过这个简单的代码行使它完美地工作起来:

this->showMaximized();

运行后,它立即流畅地填充整个屏幕。


2
尝试在 showEvent() 中调用 showFullScreen()。目前无法使用 Qt 5.1.1 进行检查,但在 4.8.x 上效果非常好。

@Thomas 更有可能的是,答案导致了你的问题被顶起来,因此其他人才会投票反对 - 回答问题的人很可能在回答之前就已经投票了。 - Tobias Kienzler

0

今天我找到了一种方法,目前看来这是最好的方法。我尝试了许多其他解决方案,但都没有奏效。

我的做法如下:

  • 清楚地获取可用屏幕分辨率。

  • 在显示窗口之前简单地调整窗口大小。

  • 正常显示窗口。

请记住,如果在设置窗口大小之前执行 showWindow(),并且主程序中有场景,则由于调整大小,滚动条将不会位于中心位置。此外,窗口可能无法正确定位。因此,请先按以下方式执行 setFixedSize()ShowNormal()

int main(int argc, char *argv[])
{

  QApplication app(argc, argv);
  WhateverMainWindowClass *w = new WhateverMainWindowClass();

/////////////////////////

  QRect screenGeometry = QApplication::desktop()->availableGeometry();
  w->resize(screenGeometry.width(), screenGeometry.height());
  w->showNormal();

/////////////////////////

  return app.exec();
}

此外,您可以使用setFixedSize()代替resize(),方法完全相同,这样大小就是静态的,没有人可以更改它。


availableGeometry() 现已过时,只需使用 w.showFullscreen()。 - CecilMerrell aka bringrainfire

0
我所做的只是通过Qtimer将全屏切换延迟1秒。这不是最好的解决方案,但它确实解决了问题。祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接