Qt док. ясно заявляет, что QResizeEvent::size()
Возвращает новый размер виджета. Это то же самое, что и QWidget :: size () .
Итак, я считаю, что наблюдаемое / сообщаемое поведение является ошибкой, которая может быть ограничена специфичной для MS Windows частью Qt.
Я сделал следующий 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
Сначала я скомпилировал и протестировал cygwin64 в Windows 10, но мне не удалось воспроизвести проблему. (В моем случае компиляция на cygwin означает, что Qt зависит от X11.)
Btw. Я был немного раздражен, поскольку showFullScreen()
не имел никакого эффекта. Я подозревал, что Cygwin XWin manager (очень особенная вещь, которая выступает посредником для встраивания X Windows в Windows. & Ndash; Однако я знаю, что у него есть определенные недостатки.)
Итак, я скомпилировал и протестировал на 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
.