【问题标题】:QWidget will not close in full screen mode on OS X (Yosemite)QWidget 不会在 OS X (Yosemite) 上以全屏模式关闭
【发布时间】:2015-05-07 16:45:57
【问题描述】:

我有一个 QWidget 子类,我正在尝试修复一个错误,即无法使用 QWidget::hide() 或 close() 方法以编程方式隐藏/关闭它所在的窗口。

以下是我尝试过的一些事情:

if(widget->isFullScreen())
{
    widget->showNormal();   //Makes the window normal-sized before closing it
    widget->hide();
}

这是我尝试过的另一种方法:

if(widget->isFullScreen())
{
    widget->setWindowState(Qt::WindowMinimized);
    widget->hide();
}

我也尝试过设置插槽/信号系统:

if(netcam->isFullScreen())
{
    connect(this, SIGNAL(fullScreenExited()),
            this, SLOT(onFullScreenExited()));

    widget->showNormal();
    this->fullScreenExited(); //just hides the widget (or closes it) 

}
else
{
    widget->hide();
}

每次结果都是窗口冻结,必须手动关闭。我怀疑第一个 showNormal() 是异步发生的,第二个 close()/hide() 从未成功执行。

我也试过这个,希望它会在继续 hide()/close() 之前完成 showNormal():

if(widget->isFullScreen())
    {
        widget->showNormal();
        QApplication::processEvents();
        widget->hide();
    }

主要问题: 有人对如何处理从 Qt 代码关闭全屏 QWidget 有任何建议吗?

也可以提供帮助的问题: 有没有办法确保事情同步运行?

谢谢!

编辑: 我让它工作的唯一方法是在流程中进一步调用 showNormal(),这可以防止 showNormal() 和 hide() 的执行重叠。我会尽量记住稍后再回来,并给出一个使用常规 QWidget 的良好基本示例。

我还应该补充一点,窗口通过 +(全屏)按钮进入全屏状态,该按钮位于 OS X 中每个窗口的顶部。

【问题讨论】:

  • 你能用一个普通的 QWidget 在一个新的项目中重现它吗?使其全屏,然后尝试关闭/隐藏它。
  • 您讨论关闭小部件,但调用 QWidget::hide。你的意思是你想隐藏小部件,或者实际上关闭它,在这种情况下 QWidget::close 可能是你正在寻找的东西? qt-project.org/doc/qt-4.8/qwidget.html#close
  • 我在 close() 和 hide() 之间切换的原因是因为我想证明这两种结果都是可以接受的。
  • [+] 不是全屏按钮,它是最大化按钮。 Mavericks 和 Yosemite 有一个单独的按钮,用于使窗口全屏显示 - 它是两个指向外部的箭头,该按钮位于窗口的右上角。你真正在说什么按钮?
  • 我说的是 [+] 按钮

标签: c++ macos qt user-interface


【解决方案1】:

这是known bug

showNormal()showMinimized() 的变通方法不起作用,因为窗口状态更改不是同步的。单个processEvent() 是不够的。您需要等待相应的QEvent::WindowStateChange 事件才能知道窗口何时完全移出全屏并可以接收新的窗口状态更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2016-03-31
    • 2015-03-20
    • 2014-07-25
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多