2012-08-02 32 views
3

我有一個QMainWindow,它有一個QWidget。出現QWidget,並且其起點設置在QMainWindow的鼠標向下事件中。然後,在QMainWindow的鼠標移動事件中,設置了QWidget的幾何圖形,以便看起來用戶正在QMainWindow頂部繪製矩形。這是我如何做到這一點:使用Qt,如何使用鼠標移動事件向上或向左調整窗口小部件

void MyQMainWindow::mousePressEvent(QMouseEvent * E) { 
    QPoint pos = e->pos(); 
    myQWidget->setGeometry(pos.x(), pos.y(), 0, 0); 
    myQWidget->show(); 
} 

void MyQMainWindow::mouseMoveEvent(QMouseEvent * e) { 
    QPoint pos = e->pos(); 
    QPoint prv = myQWidget->pos(); 
    int w = pos.x() - prv.x(); 
    int h = pos.y() - prv.y(); 

    myQWidget.setGeometry(prv.x(), prv.y(), w, h); 
} 

void MyQMainWindow::mouseReleaseEvent(QMouseEvent *) { 
    myQWidget.hide(); 
} 

這種方法的問題是,當我將鼠標向上或左鍵點擊。我對wh的計算結果是否定的,所以窗口不能正確調整(或根本不調整)。

我意識到,向上/向左移動意味着我需要更改小部件的原點,同時通過根據需要增加寬度/高度來保持小部件的右下角位於同一位置,但是如何做這個?

謝謝!

回答

1

我會做這樣的事情:

void MyQMainWindow::updateWidgetGeometry() 
{ 
     if (_initial == QPoint(-1,-1)) { 
      return; 
     } 

     x = qMin(_initial.x(), _current.x()); 
     y = qMin(_initial.y(), _current.y()); 
     w = abs(_initial.x() - _current.x()); 
     h = abs(_initial.y() - _current.y()); 

     myQWidget.setGeometry(x, y, w, h);  
} 

void MyQMainWindow::mousePressEvent(QMouseEvent * E) 
{ 
     _initial = e->pos(); 
     _current = e->pos(); 
     updateWidgetGeometry() 
     myQWidget->show(); 
} 

void MyQMainWindow::mouseMoveEvent(QMouseEvent * E) 
{ 
     _current= e->pos(); 
     updateWidgetGeometry() 
} 

void MyQMainWindow::mouseReleaseEvent(QMouseEvent *) 
{ 
    _current = QPoint(-1,-1); 
    _initial = QPoint(-1,-1); 
    myQWidget.hide(); 
} 

類型化這件事沒有編譯器。

順便說一句,您可能還需要設置鼠標跟蹤(true),這樣如果您的鼠標移動事件發生在小部件內部,MyQMainWindow纔會處理它。我不確定這一點。

+0

謝謝,我會試試這個,當我回家並接受你的成功答案。 – sfw 2012-08-02 18:02:33

+0

@sfw是否有效? – MrFox 2012-08-08 14:29:45

+0

是的,它的確如此。謝謝。 – sfw 2012-08-09 21:21:12

相關問題