Почему я получаю QWindowsWindow :: setGeometry: Невозможно установить предупреждение о геометрии с помощью Qt 5.12.0 - PullRequest
0 голосов
/ 22 января 2019

Я перенес код из Qt 5.6.0 в 5.12.0. Удивительно, но я получаю много предупреждений, связанных с QWindowsWindow::setGeometry. Всякий раз, когда диалог отображается поверх другого, я получаю это предупреждение.

Я мог бы выделить проблему в MCVE, это очень просто и минимально, все родительские функции выглядят хорошо, однако мы получаем предупреждение при нажатии кнопки:

QWindowsWindow::setGeometry: Unable to set geometry 132x30+682+303 on QWidgetWindow/'QDialogClassWindow'. Resulting geometry:  132x42+682+303 (frame: 4, 28, 4, 4, custom margin: 0, 0, 0, 0, minimum size: 116x42, maximum size: 16777215x16777215).

main.cpp:

#include <QApplication>
#include "mainframe.h"
#include <qDebug>

void MessageOutput( QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    qDebug() << msg;
}

int main( int argc, char* argv[] )
{
    QApplication app(argc, argv);

    qInstallMessageHandler(MessageOutput);

    MainFrame wnd;
    wnd.show();

    return app.exec();
}

mainframe.h:

#include <QMainWindow>

class QPushButton;
class MainFrame : public QMainWindow
{
    Q_OBJECT

public:
    MainFrame();

public slots:
    void showPopup();

private:
    QPushButton* button;
};

mainframe.cpp:

#include "mainframe.h"

#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

MainFrame::MainFrame()
{
    QWidget* widget = new QWidget( this );
    widget->setLayout( new QVBoxLayout( widget ) );

    QPushButton* pTextButton = new QPushButton( "Show popup", widget );
    widget->layout()->addWidget( pTextButton );
    connect( pTextButton, SIGNAL(clicked()), this, SLOT(showPopup()) );

    setCentralWidget( widget );
}

void MainFrame::showPopup()
{
    QDialog dlg( this );
    dlg.setLayout( new QVBoxLayout() );
    dlg.layout()->addWidget( new QLabel("popup message",&dlg) );
    dlg.exec();
}

Я вижу проблему в Windows 7 и 10. Я что-то не так делаю?

Я знаю, что предупреждение можно удалить, установив setMinimumSize (см. https://stackoverflow.com/a/31231069/3336423),, но почему мы должны делать это для каждого создаваемого виджета? Есть ли способ исправить это навсегда?

1 Ответ

0 голосов
/ 22 января 2019

Как вы упомянули, эта проблема возникает только в Windows: класс QWindowsWindow является частью плагина windows платформы. Глядя на исходный код Qt (qwindowswindow.cpp@QWindowsWindow::setGeometry), нет прямого способа приостановить это конкретное сообщение.

Единственное глобальное решение, о котором я могу подумать сейчас, - это отфильтровать предупреждающие сообщения с помощью обработчика сообщений :

void myMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
  if (type != QtWarningMsg || !msg.startsWith("QWindowsWindow::setGeometry")) {
    QByteArray localMsg = msg.toLocal8Bit();
    fprintf(stdout, localMsg.constData());
  }
}

int main(int argc, char* argv[])
{
  qInstallMessageHandler(myMessageOutput);
  QApplication a(argc, argv);
  // ...
}

UPDATE

Одна из проблем заключается в том, что Windows добавляет свои собственные кнопки в рамку. В вашем примере диалоговое окно добавляет три кнопки: системную кнопку (значок , верхний левый угол), кнопку помощи и кнопку закрытия. Кнопки справки и закрытия имеют фиксированный размер, который оказывается больше, чем кадр QDialog (который вычисляется как максимальное значение между запрошенным размером и minimumSize). Затем генерируется предупреждение: ваш запрошенный размер не соответствует размеру, созданному Windows:

Dialog with help & close buttons

Если вы удалите кнопку справки, например (dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);), предупреждение исчезнет без установки минимального размера окна. Для каждого отображаемого диалогового окна необходимо выполнить ручное действие, но я думаю, что его проще автоматизировать, чем минимальный размер (возможно, через заводские настройки):

Dialog without help button

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...