我绝望地失败在假定的简单问题,以获得Qt窗口在屏幕上的位置和几何形状。我最初在Python/PyQt上下文中偶然发现了这个问题,但后来跟踪到Qt本身,当用户使用任何顶部或左侧边缘或角落调整窗口大小时,QWidget::pos()
属性不会更新,即,调整涉及左上角原点的大小,因此窗口的位置。
下面的Qt/c++程序是重现问题的最小程序(名称为Qt_test.cc
并使用qmake -project Qt_test.cc; qmake; make
构建):
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDebug>
class PrintingQWidget : public QWidget {
Q_OBJECT
public slots:
void print() {
qDebug() << pos() << width() << height();
}
};
#include "Qt_test.moc"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
PrintingQWidget window;
QPushButton btn("Print position", &window);
window.connect(&btn, SIGNAL(clicked()), SLOT(print()));
window.show();
return app.exec();
}
点击"打印位置"获取窗口坐标,然后使用上边缘或左边缘调整窗口大小,再次点击。在我的系统(MacOSX)上,QWidget::pos()属性中的窗口位置没有更新。我从文档中清楚地了解到,QWidget::pos()应该总是生成小部件左上角的坐标,但事实并非如此。
有人能重现这个问题吗?有解决方法吗?
好的,看来这实际上是Qt 4.8中的一个bug。我的示例程序以及Merlin069的版本在Qt 5中表现得非常好。Qt 4.8.2和Qt 4.8.4都受到这个bug的影响。(对于Qt 4.8.4,我测试了自制和dmg安装,两者都表现不正常)。我的测试系统是MacOSX 10.7.5。
也许你们中使用不同系统/Qt版本的人仍然可以运行测试程序并报告,以便我可以提交更好的错误报告?
仔细查看您的代码,您不应该包含moc文件。无论如何,我决定自己编码,我得到正确的,预期的坐标在屏幕空间。代码如下:-
头(widget.h)
#include <QWidget>
#include <QDebug>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget* parent = NULL)
: QWidget(parent)
{
}
virtual ~MyWidget()
{
}
public slots:
void PrintPos() const
{
qDebug() << pos() << width() << height();
}
};
Main.cpp
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget debugWidget(NULL);
QPushButton btn("print position", &debugWidget);
QObject::connect(&btn, &QPushButton::released, &debugWidget, &MyWidget::PrintPos);
debugWidget.show();
return app.exec();
}