问题来自https://stackoverflow.com/a/52151020/3308570。 (包含一个重现该问题的示例)
我正在尝试显示全屏时的小部件尺寸。起初,我从QResizeEvent::size
中选取了大小。但是大小只能正常运行一次。喜欢:
1920x1080
500x400
516x439
然后我更改为在QWidget::size
中使用QResizeEvent
,它始终在全屏显示时提供正确的结果1920x1080
。
这是一个错误,还是我做错了什么?
Env: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)
答案 0 :(得分:1)
Qt文档。明确指出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
属性。