【问题标题】:Qt FullScreen on Startup启动时的 Qt 全屏
【发布时间】:2013-11-18 00:46:41
【问题描述】:

我想根据设置全屏启动应用程序(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-&gt;showFullScreen() 做了一些非常丑陋的事情:

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

如果需要,我可以提供视频。如何避免这种情况?

edit :

添加视频here,在没有设置的情况下做了一个更好的sn-p

【问题讨论】:

  • 你试过调用 setWindowFlags(Qt::Window | Qt::WindowFullScreen | Qt::Customize) 吗?
  • @Merlin069 Qt::Customize Qt 似乎不知道,如果我删除它,编译会失败并显示最糟糕的消息
  • 对不起,我错了,应该是 Qt::CustomizeWindowHint
  • @Merlin069 error: no viable conversion from 'unsigned int' to 'Qt::WindowFlags' (aka 'QFlags&lt;Qt::WindowType&gt;')
  • 尝试不在构造函数中调用 showFullScreen,而是在之后(在 main() 或创建主窗口的任何地方)

标签: c++ macos qt fullscreen


【解决方案1】:

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

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

【讨论】:

  • 不需要1秒延迟,时间值用0,看起来更自然。
  • 既然你更新了代码,你可能想更新你关于那一秒的陈述......现在这样很混乱。
【解决方案2】:

如果您希望应用以最大化窗口的形式打开,请使用以下命令:

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

如果您希望应用以全屏窗口形式打开,请使用以下命令:

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

【讨论】:

  • 我认为 this 是 OP 想要的。
  • 简洁的替代品是 w.showMaximized()w.showFullScreen()
【解决方案3】:

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

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

【讨论】:

  • 我应该在哪里添加这部分?你能澄清更多吗?谢谢
  • @Yamur 他的代码引用了ui-&gt;setupUi(),所以它会在构造函数中。我相应地更新了答案以使其清楚,特别是因为我认为这是最好(最干净)的解决方案。
【解决方案4】:

QWidget 状态应该对您有所帮助。请遵循此 Qt 文档:QWidget::setWindowState

将应用全屏显示的方式:

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

谢谢

【讨论】:

  • 像魅力一样工作。虽然我没有使用任何 ^ 并且只是在我的 MainWindow 类的构造函数中执行 this-&gt;setWindowState(Qt::WindowFullScreen) 并且它会立即开始全屏显示。使用 QTimer 的问题在于,即使您将其设置为 1,您仍然可以看到窗口如何最大化以便可以进入全屏状态,说实话这看起来不太好。
【解决方案5】:

尝试在showEvent() 中调用showFullScreen()。我目前无法用 Qt 5.1.1 检查它,但它在 4.8.x 上运行得很好

【讨论】:

  • @Thomas 答案更有可能导致您的问题被质疑,从而导致其他人投反对票 - 回答的人很可能会在费心回答之前投票
【解决方案6】:

我使用 QWidget 作为我的主窗口,但我让它与这个简单的行完美地工作:

this->showMaximized();

运行时,它立即流畅地填满了整个屏幕。

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      我今天找到了一种方法,到目前为止它似乎对我来说是最好的。我尝试了许多其他解决方案,但都没有奏效。

      我做的是;

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

      • 在 showinf 窗口之前调整窗口大小

      • 正常显示窗口

      请记住,如果您在设置窗口大小调整之前执行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()
      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多