【问题标题】:Qt - cross platform behaviourQt - 跨平台行为
【发布时间】:2018-09-14 23:00:01
【问题描述】:

我正在尝试部署一个用 c++ 编写的跨平台 Qt 应用程序。它在我的 Ubuntu Linux 上运行良好,但是当我在 Windows 上运行它时,应用程序的主窗口的位置设置在屏幕的左上角,上框(包含最小化、最大化、关闭按钮)缺少。

直到我调整主窗口的大小(在这种情况下,使宽度从右侧变小)。当这种情况发生时,上部框架和控制按钮会出现在我提供的可视化中。

注意:我已经删除了应用程序上的所有小部件,因此它们不会让人分心。

注意 2:似乎最大化按钮被禁用,这在 Ubuntu 中并非如此。我没有设置任何窗口标志。

如何在应用程序一开始就可视化上部框架而无需调整窗口大小。我理解它是操作系统特定的行为。将主窗口的几何图形设置为具有较高 y 值的起点并没有帮助。它仍然出现在屏幕的最左上角。

【问题讨论】:

  • 你使用QWidget::showMaximized()函数吗?如何设置窗口的几何形状?
  • @vahancho 不,我不使用 showMaximized()。在 MainWindow 构造函数末尾 this->setGeometry(0, 0, 1336, 600);。我知道 x:0 和 y:0 是左上角,没关系。它只是没有出现在 Windows 中的框架。在 ubuntu 中,框架就在那里。
  • 我怀疑,setGeometry() 函数没有考虑标题栏和集合在主窗口的 client 部分的位置。这就是为什么您的主窗口的标题栏离开屏幕的原因。如果它满足您的需求,我会尝试使用QWidget::showMaximized()
  • @vahancho showMaximized() 可以做到这一点,但我不能以最大化模式启动应用程序。这是一个小问题的巨大解决方法

标签: c++ windows qt user-interface cross-platform


【解决方案1】:

尝试在setGeometry之后使用QWidget::move设置窗口位置。

如果小部件是窗口,则位置是小部件在 桌面,包括它的框架。

【讨论】:

    【解决方案2】:

    你问了一个关于跨平台 UI 代码的问题,然后你没有显示完整的代码。请出示完整代码。

    你展示的那一行代码做错了事:如果你想最大化一个窗口,调用适当的函数,而不是设置你认为最大化窗口的绝对大小。 Windows,它们的装饰和位置都非常特定于平台,您应该更喜欢它们的跨平台抽象而不是尝试自己做。

    具体来说:窗口定位在 Windows 和 Ubuntu 上以不同方式处理装饰(标题栏)。除了绝对不能像这样放置您的窗口之外,您绝对无能为力。

    【讨论】:

      【解决方案3】:

      在MainWindow构造函数末尾this->setGeometry(0, 0, 1336, 600);

      这就是问题所在。 setGeometry 处理客户区的几何形状。这是well documented。您应该使用move 来更改小部件框架的位置。设置框架的大小需要知道框架的增量宽度和高度:

      bool setWidgetFrameGeometry(QWidget *w, const QRect &r) {
        auto frame = w->frameGeometry().size();
        auto client = w->size();
        auto delta = frame - client;
        auto maxDelta = 128;
        if (delta.width() > 0 && delta.width() < maxDelta 
            && delta.height() > 0 && delta.height() < maxDelta) {
          w->move(r.topLeft());
          w->resize(r.size() - delta);
          return true;
        }
        return false;
      }
      

      调用可能需要推迟到事件循环有机会运行时:

      auto setter = [this]{ return setWidgetFrameGeometry(this, {0,0,1336,600}); };
      if (!setter())
        QTimer::singleShot(0, this, setter);
      

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 1970-01-01
        • 2015-12-10
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多