我将一些代码从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)来消除警告,但是为什么我们应该对创建的每个小部件都这样做呢?有没有办法永久解决?
答案 0 :(得分:3)
正如您提到的,此问题仅在Windows中出现:QWindowsWindow
类是windows
平台插件的一部分。查看Qt的源代码(qwindowswindow.cpp@QWindowsWindow::setGeometry
),没有直接的方法可以暂停该特定消息。
我现在唯一想到的全局解决方案是使用message handler过滤警告消息:
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);
// ...
}
更新
问题之一是Windows将自己的按钮添加到框架。在您的示例中,对话框添加了三个按钮:系统按钮(图标,左上角),帮助按钮和关闭按钮。帮助和关闭按钮的大小固定不变,恰好大于QDialog
的框架(计算为请求的大小和minimumSize
之间的最大值)。然后生成警告:您请求的大小与Windows创建的大小不匹配:
如果删除帮助按钮(例如(dlg.setWindowFlags(dlg.windowFlags() & ~Qt::WindowContextHelpButtonHint);
),则警告会消失,而不会设置窗口的最小大小。对于显示的每个对话框,都必须采取手动操作,但是我认为,自动化比最小尺寸要容易(可能是通过工厂?):
答案 1 :(得分:1)
该问题已报告给 Qt: https://bugreports.qt.io/browse/QTBUG-73258
OP中的代码没问题,只是Qt的一个bug。
它被标记为“P2重要”,所以希望它应该在下一个版本中修复。