1. 程式人生 > >Qt 視窗部件在主視窗中的位置 子視窗在主視窗的相對區域 pos()函式的理解

Qt 視窗部件在主視窗中的位置 子視窗在主視窗的相對區域 pos()函式的理解

在主視窗中拖入一個QWidget(物件名取為centralWidget),接著在centralWidget中拖入一個QScrollArea,然後在其上放一個QLabel。如下圖所示:



在主視窗的建構函式中新增如下語句:

qDebug()<<"centralWidget pos: "<<ui->centralWidget->pos();
qDebug()<<"scrollArea pos: "<<ui->scrollArea->pos();
qDebug()<<"label pos: "<<ui->label->pos();

結果如下:

centralWidget pos:  QPoint(50,50)
scrollArea pos:  QPoint(70,40)
label pos:  QPoint(90,100)

接著改變Label的位置,使其左上角與scrollArea的左上角重合(如下圖)


結果如下:

centralWidget pos:  QPoint(50,50)
scrollArea pos:  QPoint(70,40)
label pos:  QPoint(0,0)

接著拖動scrollArea,使其左上角與centralWidget的左上角重合(如下圖)


結果如下:

centralWidget pos:  QPoint(50,50)
scrollArea pos:  QPoint(0,0)
label pos:  QPoint(0,0)

由此可以看出:pos()函式得到的是子視窗相對於父視窗的位置,而不管父視窗在其父視窗中的位置如何。

----------------------------------------------------------------------------------------------------------------------------

因此想獲得scrollArea在主視窗中的相對位置區域,可採用如下語句:

QRect ScrollRect = QRect(ui->centralWidget->pos()+ui->scrollArea->pos(), ui->scrollArea->size());

我們做一個小實驗來驗證這一點,首先按上面所說的得到scrollArea的相對位置區域ScrollRect,接著重寫主視窗的滑鼠點選事件處理函式,在其中判斷是否點選了scrollArea區域,如果點選了則設定label顯示相應文字和點選座標。

void Postest_Widget::mousePressEvent(QMouseEvent *event)
{
    if( ScrollRect.contains(event->pos()) )
    {
        ui->label->setText( QString("滑鼠點選scrollArea區域: (%1,%2)").arg(QString::number(event->x())).arg(QString::number(event->y())) );
    }
    else
        ui->label->setText( QString("TestLabel") );
}

當我們點選scrollArea左上角時,執行結果如下: