我拼命地在所谓的简单问题上失败,以获得屏幕上Qt窗口的位置和几何形状。我最初在Python/PyQt context中偶然发现了这个问题,但后来跟踪到了Qt本身,当用户使用任何顶部或左边或边角调整窗口大小时,QWidget::pos()
属性不会更新,即调整涉及左上角原点的大小,因此position of the window。
以下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()属性中的窗口位置未更新。我清楚地从documentation了解到QWidget :: pos()应该总是产生小部件左上角的坐标,但事实并非如此。
任何人都可以重现这个问题吗?任何解决方法?
答案 0 :(得分:2)
好吧,看来这实际上是Qt 4.8中的一个错误。我的示例程序以及Merlin069的版本在Qt 5中表现得非常好.Qt 4.8.2和Qt 4.8.4都受到bug的影响。 (对于Qt 4.8.4,我测试了自制和dmg安装,两者都表现不正确)。我的测试系统是MacOSX 10.7.5。
也许你们中有些人使用不同的系统/ Qt版本仍然可以运行测试程序并向后报告,以便我可以提交更好的错误报告?
答案 1 :(得分:1)
仔细查看代码,不应该包含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();
}