2013-05-09 189 views
1

我拼命在所谓简单的问题,未能获得在屏幕上的Qt窗口的位置和几何尺寸缩小时没有更新。我本来无意中发现这个问题在Python/PyQt context,但因为它追踪到的Qt本身,当用户使用任何顶部或左侧边缘或转角,即调整窗口大小不更新QWidget::pos()特性,重新调整涉及的由来在左上角,因此position of the windowQWidget的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()属性中的窗口位置未更新。我清楚地从documentation了解到,QWidget :: pos()应该总是产生窗口小部件左上角的坐标,但情况并非如此。

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

+1

从链接的文档,它指出pos是相对父插件的位置,除非小部件是QWindow,在这种情况下,它会给桌面坐标。由于您尚未创建QWindow,但只是一个QWidget,它不会返回桌面位置,而是相对于其父级而不是桌面的位置。作为一种“解决方法”,创建一个窗口,添加按钮并获取窗口的位置。 – TheDarkKnight 2013-05-09 10:15:49

+0

感谢您的线索。不过,看起来QWindow仅在Qt 5中可用。在Qt 4中,似乎没有父母的QWidgets只是成为窗口。我尝试了QMainWindow,但它的行为方式与它从QWidget继承相同。另外,pos()的坐标显然是桌面位置。它们只是在调整大小时不能正确更新。 – Stefan 2013-05-09 10:38:07

+0

尝试widget-> mapToGlobal(widget-> pos()) – TheDarkKnight 2013-05-09 10:40:18

回答

2

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

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

1

看你的代码越近,你不应该包括商务部的文件。无论如何,我决定自己编码,并在屏幕空间中获得正确的预期坐标。下面的代码: -

页眉(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(); 
} 
+0

在MacOSX 10.7上,Qt 4.8.2没有成功。使用你的代码(我需要使用connect()中的SIGNAL和SLOT宏来编译),在调整pos()方面仍然没有更新。你使用的是什么版本的Qt,你在什么操作系统上? – Stefan 2013-05-09 17:01:16

+1

如果不创建单独的头文件,只需要包含moc文件。这与问题无关。 – Stefan 2013-05-09 17:08:27

+0

对不起,我不知道关于moc - 我想我总是使用标题。我在OS X 10.8.3上的Qt 5.0.0上,虽然我认为这很简单,但这不应该导致你在这些版本中看到的问题。然而,值得一看的是在两个版本的Qt之间发布的修补程序,并查看是否有关于它的任何信息。 – TheDarkKnight 2013-05-10 07:32:02