为什么QResizeEvent和QWidget :: size在全屏时会有所不同?

问题描述 投票:1回答:1

问题来自https://stackoverflow.com/a/52151020/3308570。 (包含重现问题的示例)

我试图在显示全屏时获取小部件大小。起初,我从QResizeEvent::size获取了大小。但尺寸只能正常工作一次。喜欢:

  1. 全屏显示
  2. QResizeEvent ::size⇒1920x1080
  3. 显示正常
  4. QResizeEvent ::size⇒500x400
  5. 全屏显示
  6. QResizeEvent ::size⇒516x439

然后我改为在QWidget::size中使用QResizeEvent,它总是在全屏时给出正确的结果1920x1080

这是一个错误,还是我做错了什么?

环境:Qt 5.10.1 Mingw32 Win10

更新:

我找到了问题,因为videoWidget显示不正确的大小。然后我通过调试检查大小。

谢谢@Scheff,我替换了resizeEvent函数部分来观察问题:

ushort i = 0;
void resizeEvent(QResizeEvent* event) {
    i++;
    const QSize sizeEventOld = event->oldSize();
    const QSize sizeEvent = event->size();
    const QSize sizeWidgetBefore = size();
    const QSize sizeWidgetAfter = size();
    qDebug() << "Widget::resizeEvent():" << i;
    qDebug() << "QResizeEvent::oldSize  :" << sizeEventOld;
    qDebug() << "QResizeEvent::size     :" << sizeEvent;
    qDebug() << "Widget::size() (before):" << sizeWidgetBefore;
    qDebug() << "Widget::size() (after) :" << sizeWidgetAfter;
    videoWidget->resize(size());
    event->accept();
}

Mingw32,MSVC2013输出:

Widget::resizeEvent(): 1 // The window initilized
QResizeEvent::oldSize  : QSize(-1, -1)
QResizeEvent::size     : QSize(500, 400)
Widget::size() (before): QSize(500, 400)
Widget::size() (after) : QSize(500, 400)
Widget::resizeEvent(): 2 // Double click, show fullscreen.
QResizeEvent::oldSize  : QSize(500, 400)
QResizeEvent::size     : QSize(1920, 1080)
Widget::size() (before): QSize(1920, 1080)
Widget::size() (after) : QSize(1920, 1080)
Widget::resizeEvent(): 3 // Double click, show normal.
QResizeEvent::oldSize  : QSize(1920, 1080)
QResizeEvent::size     : QSize(500, 400)
Widget::size() (before): QSize(500, 400)
Widget::size() (after) : QSize(500, 400)
Widget::resizeEvent(): 4 // Double click, show fullscreen(2nd time)
QResizeEvent::oldSize  : QSize(500, 400)
QResizeEvent::size     : QSize(516, 439)
Widget::size() (before): QSize(1920, 1080)
Widget::size() (after) : QSize(1920, 1080)
Widget::resizeEvent(): 5 // Double click, show normal(2nd time)
QResizeEvent::oldSize  : QSize(1920, 1080)
QResizeEvent::size     : QSize(500, 400)
Widget::size() (before): QSize(500, 400)
Widget::size() (after) : QSize(500, 400)
qt qwidget
1个回答
1
投票

Qt doc。明确表示QResizeEvent::size()

返回窗口小部件的新大小。这与QWidget::size()相同。

因此,我认为观察/报告的行为是一个可能仅限于Qt的MS Windows特定部分的错误。

我制作了以下MCVE来重现。

testQResize.cc

#include <QtWidgets>

class Widget: public QWidget {
  private:
    unsigned _i; // event counter
    QPushButton _qBtn;
  public:
    Widget(QWidget *pQParent = nullptr);

  protected:
    virtual void resizeEvent(QResizeEvent *pQEvent);
  private:
    void toggleFullScreen();
};

Widget::Widget(QWidget *pQParent):
  QWidget(pQParent),
  _i(0), _qBtn("Click to toggle fullscreen mode", this)
{
  connect(&_qBtn, &QPushButton::clicked,
    [this](bool) { toggleFullScreen(); });
}

void Widget::resizeEvent(QResizeEvent *pQEvent)
{
  ++_i;
  const QSize sizeEventOld = pQEvent->oldSize();
  const QSize sizeEvent = pQEvent->size();
  const QSize sizeWidget = size();
  _qBtn.resize(pQEvent->size());
  //QWidget::resizeEvent(pQEvent);
  // report
  qDebug() << "Widget::resizeEvent():" << _i;
  qDebug() << "pQEvent->oldSize():" << sizeEventOld;
  qDebug() << "pQEvent->size()   :" << sizeEvent;
  qDebug() << "this->size()      :" << sizeWidget;
  qDebug() << "this->_qBtn.size():" << _qBtn.size();
}

void Widget::toggleFullScreen()
{
  if (!isFullScreen()) showFullScreen();
  else showNormal();
}

int main(int argc, char **argv)
{
  qDebug() << "Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  Widget win;
  win.show();
  return app.exec();
}

testQResize.pro

SOURCES = testQResize.cc

QT = widgets

首先,我在Windows 10上对cygwin64进行了编译和测试,但我无法重现该问题。 (在cygwin上编译意味着在我的情况下,这个Qt取决于X11。)

顺便说一句。我有点恼火,因为showFullScreen()没有任何影响。我怀疑cygwin XWin经理(一个非常特别的东西,它充当了在Windows中嵌入X窗口的中间人。 - 但是,我知道它有一定的弱点。)

所以,我在VS2013(平台64位)上编译和测试:

Version: 5.9.2
Widget::resizeEvent(): 1
pQEvent->oldSize(): QSize(-1, -1)
pQEvent->size()   : QSize(100, 30)
this->size()      : QSize(100, 30)
this->_qBtn.size(): QSize(100, 30)
Widget::resizeEvent(): 2
pQEvent->oldSize(): QSize(640, 480)
pQEvent->size()   : QSize(640, 480)
this->size()      : QSize(120, 30)
this->_qBtn.size(): QSize(640, 480)
Widget::resizeEvent(): 3
pQEvent->oldSize(): QSize(120, 30)
pQEvent->size()   : QSize(2560, 1440)
this->size()      : QSize(2560, 1440)
this->_qBtn.size(): QSize(2560, 1440)
Widget::resizeEvent(): 4
pQEvent->oldSize(): QSize(2560, 1440)
pQEvent->size()   : QSize(120, 30)
this->size()      : QSize(120, 30)
this->_qBtn.size(): QSize(120, 30)
Widget::resizeEvent(): 5
pQEvent->oldSize(): QSize(120, 30)
pQEvent->size()   : QSize(136, 69)
this->size()      : QSize(2560, 1440)
this->_qBtn.size(): QSize(136, 69)
Widget::resizeEvent(): 6
pQEvent->oldSize(): QSize(2560, 1440)
pQEvent->size()   : QSize(120, 30)
this->size()      : QSize(120, 30)
this->_qBtn.size(): QSize(120, 30)

(在我的情况下,2560x1440是全尺寸的。)

这个问题在Widget::resizeEvent(): 5之后出现。

我不知道为什么会这样,但它似乎仅限于Qt MS Windows特定代码。

然而,OP已经提出了一个解决方案,这对我来说似乎非常合理:不依靠QResizeEvent::size而是使用QWidget::size属性。

© www.soinside.com 2019 - 2024. All rights reserved.