一,Qt全屏显示相关函数

1,全屏显示函数

QWidget::showFullScreen(); // 此方法只对顶级窗口有效,对子窗口无效

2,恢复显示函数

QWidget::showNormal(); // 此方法也只对顶级窗口有效,对子窗口无效

3,最小化显示函数

 QWidget::showMinimized();

4,最大化显示函数

QWidget::showMaximized();

5,设置窗口类型

QWidget::setWindowFlags(Qt::WindowFlags);

 

二,子窗口全屏显示

Qt中的窗口QWidget成员函数showFullScreen,可以将窗口全屏显示,但是只是对窗口模式有用,而且窗口必须是顶级窗口,调用isTopLevel判断窗口是否为顶级窗口。

如何让子窗口成为顶级窗口呢?只需要将窗口QWidget的父窗口设置为nullptr,同时调用SetWindowFlags(Qt::Dialog);或setWindowFlags(Qt::Window)。若没有调用setParent(nullptr),只是调用了SetWindowFlags(Qt::Dialog)或者SetWindowFlages(QT::Window),则子窗口只会从主窗口中分离出来,但是子窗口并不会全屏显示,即showFullScreen调用是失败的,这一点尤其需要注意。

全屏显示过程如下:

void FormPageEdit::AMFullScreen()
{
    m_pFormPage->removeFormPageEdit();

    setWindowFlags(Qt::Window);
    showFullScreen();
}

 这里FormPageEdit是继承QWidget的一个子窗口,m_pFormPage是主窗口,在出窗口中定义了一个


QStackedWidget,调用ui->stackedWidgetPage->addWidget(m_pFormPageEdit);将子窗口添加到stackedWidgetPage中,我们全屏显示时,需要将子窗口的父类置为nullptr


void FormPage::removeFormPageEdit()
{
    ui->stackedWidgetPage->removeWidget(m_pFormPageEdit);
}

如上代码,调用removeWidget则从stackedWidgetPage中移除了子窗口,同时子窗口的父类就为nullptr了。

三,子窗口全屏恢复显示

子窗口全屏显示恢复是个相反的过程,首先将子窗口类型的设置为子窗口类型(之前已经被设置为窗口了),然后调用showNormal(),这里的showNormal对子窗口类型有效,然后恢复子窗口的父窗口,也就是将子窗口重新添加到stackedWidgetPage中。

void FormPageEdit::AMNormalScreen()
{
    showNormal();
    setWindowFlags(Qt::SubWindow);

    m_pFormPage->setFormPageEdit();
}

void FormPage::setFormPageEdit()
{
    ui->stackedWidgetPage->addWidget(m_pFormPageEdit);
    ui->stackedWidgetPage->setCurrentWidget(m_pFormPageEdit);
}

四,注意事项

一定要清楚子窗口的父窗口是谁,上面的代码,如果直接创建子窗口时,直接保存子窗口的父窗口,然后再全屏,这样会有问题的,具体问题就是子窗口一直显示的很大(已经在父窗口内显示了,但是界面还是很大),具体原因就是没用调用stackedWidgetPage->addWidget函数,正确的方式是添加或者移除父窗口是应该调用stackedWidgetPage的成员函数操作,而不是直接给子窗口的父窗口的指针。

 

五,多屏全屏显示问题

我的电脑是双屏,一个只主屏幕,一个是扩展屏幕,默认全屏模式,全屏窗口只会显示在主显示屏上,那么如何控制窗口全屏在哪个显示屏上呢?

// 全屏显示
void FormPageEdit::AMFullScreen()
{
    m_pFormPage->removeFormPageEdit();

    setWindowFlags(Qt::Window);

    QDesktopWidget *desktop = QApplication::desktop();
    int screen_count = desktop->screenCount(); // 获取显示屏个数
    int prim_screen = desktop->primaryScreen(); // 获取主显示屏编号

    // QWidget *parentDesktop  = desktop -> screen(prim_screen); // 主屏显示
    QWidget *parentDesktop  = desktop -> screen(1); // 扩展屏幕显示
    this->setParent(parentDesktop);

    showFullScreen();
}

如上,这里我们获取显示屏的个数,然后设置子窗口的父窗口,如果设置为主屏幕ID,则全屏在主屏幕显示,如果设置为扩展屏幕ID,则在扩展屏幕进行显示。

扩展屏幕全屏效果:

Qt Advanced Docking System说明_父窗口

从这里其实可以看出,默认父窗口为nullptr,其实系统会默认将主屏幕的窗口作为子窗口的父窗口来设置。

如果需要主屏和扩展屏幕全部全屏显示呢?

这个留给读者自己思考了,需要源码的可以私信给我。