1

我在所谓的简单问题上拼命失败,无法在屏幕上获取 Qt 窗口的位置和几何形状。我最初在Python/PyQt 上下文中偶然发现了这个问题,但后来将其跟踪到 Qt 本身,QWidget::pos()当用户使用任何顶部或左侧边缘或角调整窗口大小时,该属性不会更新,即调整涉及的大小左上角的原点,因此是 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() 属性中的窗口位置没有更新。我从文档中清楚地了解到QWidget::pos() 应该始终产生小部件左上角的坐标,但事实并非如此。

任何人都能够重现这个问题?任何解决方法?

4

2 回答 2

2

好的,看来这实际上是 Qt 4.8 中的一个错误。我的示例程序以及 Merlin069 的版本在 Qt 5 上表现得非常好。Qt 4.8.2 和 Qt 4.8.4 都受到该错误的影响。(对于 Qt 4.8.4,我测试了 homebrew 和 dmg 安装,它们的行为都不正确)。我的测试系统是 MacOSX 10.7.5。

也许你们中的一些不同系统/Qt 版本仍然可以运行测试程序并报告回来,以便我可以提交更好的错误报告?

于 2013-05-10T09:32:54.263 回答
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();
    }
};

主文件

#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();
}
于 2013-05-09T15:39:53.463 回答