QWidget pos()在涉及原点的调整大小期间未更新

时间:2013-05-09 09:45:58

标签: macos qt4 qwidget

我拼命地在所谓的简单问题上失败,以获得屏幕上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()应该总是产生小部件左上角的坐标,但事实并非如此。

任何人都可以重现这个问题吗?任何解决方法?

2 个答案:

答案 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();
}