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



我绝望地失败在假定的简单问题,以获得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();
}

相关内容

  • 没有找到相关文章

最新更新