2013-05-09 107 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