1. 程式人生 > >qt的pos()和globalpos()(globalpos是相對於桌面的)

qt的pos()和globalpos()(globalpos是相對於桌面的)

動作 無法 解釋 執行 sse www seve exe eve

參考:http://www.cppblog.com/izualzhy/archive/2011/03/21/142408.html

原文粘貼:

新建一個窗口程序,然後創建一個QMenu對象。在構造函數裏初始化
menu = new QMenu("menu", this); //menu在頭文件聲明
QAction *action = new QAction(tr("1111"), this); //為使目錄較大,能看見,我們添加一個action
menu->addAction(action);

然後在mousePressEvent裏看到效果
void Dialog::mousePressEvent(QMouseEvent *e)
{
if(e->button() == Qt::RightButton) //鼠標右鍵。避免無法關掉窗口
{
QPoint p(0, 0);
//menu->exec(p); //測試用,坐標相對於桌面
menu->exec(e->globalPos()); //坐標相對於窗口
//menu->exec(e->pos()); //坐標相對於桌面
}
}

可以看到,pos不管窗口怎樣移動,menu總是出現在相同的地方。globalPos相對於窗口,跟著窗口移動.

pos不管窗口怎樣移動,menu總是出現在相同的地方。
假設我們一直點擊的是窗口右上角,menu總是出現在同樣的地方。也就是類似於執行menu->exec(QPoint(1000,0))
所以p的值沒變,但相對於桌面我們點的地方已經變了,只是相對窗口的坐標p一直是(1000,0),所以pos是相對窗口的。。。
globalPos相對於窗口,跟著窗口移動。不論我點哪菜單就在哪show,所以是相對桌面的,要不叫global呢~~

//------------------------------------------------------------------------------------------------------------------------------------------------------------

上面的解釋拘謹於表面現象,得出的結論有點誤導人。本人在程序中通過添加QLabel實例顯示坐標信息,得知

globalPos(),給出的坐標信息是相對於桌面的,即以桌面左上角為原點。

pos(),是相對於窗口的,以窗口左上角為原點(去除邊框)。即pos()給出的是一個相對位置坐標。而globalPos(),給出的是一個絕對坐標。

上例中巧用了一個上下文菜單來說明問題,因為上下文菜單出現的位置就是此時要設定的位置。

在qt4編程第2版中提到關於創建上下文菜單的方法:

1.重新實現QWidget::contextMenuEvent()函數,創建一個QMenu窗口部件,在其中添加所期望的那些動作,並用再對該窗口調用exec()函數。

2.設定窗口部件的contextmeunupolicy為Qt::ActionsContextMenu然後往窗口部件裏面添加QAction實例。

http://blog.csdn.net/u013394556/article/details/38797295

qt的pos()和globalpos()(globalpos是相對於桌面的)