当前位置:   article > 正文

Qt子窗口全屏显示_qt 窗体嵌套 不能全屏

qt 窗体嵌套 不能全屏

一,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调用是失败的,这一点尤其需要注意。

全屏显示过程如下:

  1. void FormPageEdit::AMFullScreen()
  2. {
  3. m_pFormPage->removeFormPageEdit();
  4. setWindowFlags(Qt::Window);
  5. showFullScreen();
  6. }

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

QStackedWidget,调用ui->stackedWidgetPage->addWidget(m_pFormPageEdit);将子窗口添加到stackedWidgetPage中,我们全屏显示时,需要将子窗口的父类置为nullptr
  1. void FormPage::removeFormPageEdit()
  2. {
  3. ui->stackedWidgetPage->removeWidget(m_pFormPageEdit);
  4. }

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

三,子窗口全屏恢复显示

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

  1. void FormPageEdit::AMNormalScreen()
  2. {
  3. showNormal();
  4. setWindowFlags(Qt::SubWindow);
  5. m_pFormPage->setFormPageEdit();
  6. }
  7. void FormPage::setFormPageEdit()
  8. {
  9. ui->stackedWidgetPage->addWidget(m_pFormPageEdit);
  10. ui->stackedWidgetPage->setCurrentWidget(m_pFormPageEdit);
  11. }

四,注意事项

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

 

五,多屏全屏显示问题

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

  1. // 全屏显示
  2. void FormPageEdit::AMFullScreen()
  3. {
  4. m_pFormPage->removeFormPageEdit();
  5. setWindowFlags(Qt::Window);
  6. QDesktopWidget *desktop = QApplication::desktop();
  7. int screen_count = desktop->screenCount(); // 获取显示屏个数
  8. int prim_screen = desktop->primaryScreen(); // 获取主显示屏编号
  9. // QWidget *parentDesktop = desktop -> screen(prim_screen); // 主屏显示
  10. QWidget *parentDesktop = desktop -> screen(1); // 扩展屏幕显示
  11. this->setParent(parentDesktop);
  12. showFullScreen();
  13. }

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

扩展屏幕全屏效果:

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

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

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

 

各位看官,有钱的捧个钱场,没钱的捧个人场。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/95110
推荐阅读
相关标签
  

闽ICP备14008679号