[英]Qt Troubles with painting selection box
我在強制重新粉刷/更新Qt窗口小部件時遇到麻煩(它擴展了QGraphicsView
類)。 我要繪制一個矩形選擇框,當用戶按下並移動鼠標時,該框將突出顯示目標選擇區域。
基本工作流程:
making_selection_box
標志,並存儲起點(工作中)。 making_selection_box
被重置。 屏幕應該更新以刪除選擇框工件(不起作用)。 重寫的mouseMoveEvent:
void QSchematic::mouseMoveEvent(QMouseEvent *event)
{
if(making_selection_box)
{
// get selection box
qDebug() << "updating selection box";
curr_selection_end = event->pos();
repaint(box(drag_select_start, curr_selection_end));
}
// propogate event
QGraphicsView::mouseMoveEvent(event);
}
我重寫的paintEvent:
void QSchematic::paintEvent(QPaintEvent *event)
{
qDebug() << "paintEvent";
if(making_selection_box)
{
qDebug() << "drawing selection box";
QPainter painter(viewport());
painter.setPen(Qt::black);
painter.drawRect(box(drag_select_start, curr_selection_end));
painter.end();
}
// propogate event
QGraphicsView::paintEvent(event);
}
Box只是我編寫的一個小輔助函數,用於為不同的選擇框起點/終點創建正確的QRect。
static QRect box(const QPoint& p1, const QPoint &p2)
{
int min_x = p1.x();
int min_y = p1.y();
int max_x = p2.x();
int max_y = p2.y();
if(max_x < min_x)
{
max_x = min_x;
min_x = p2.x();
}
if(max_y < min_x)
{
max_y = min_y;
min_y = p2.y();
}
return QRect(min_x, min_y, max_x - min_x, max_y - min_y);
}
我已驗證當用戶按下按鈕並四處移動鼠標時,可以正確觸發mouseMoveEvent。
我還驗證了在執行各種標准操作(例如調整窗口大小,最小化/最大化窗口等)時,系統正在調用paintEvent。
我已經驗證了我用來繪制小部件的方法可以與其他paintEvent觸發器一起正常使用,但我只是無法設法在代碼中觸發重繪。
我也嘗試通過使用update()
方法而不是repaint()
來強制更新,但是沒有運氣。
作為附帶說明,我要以錯誤/困難的方式創建此選擇框功能嗎? 是否有更好的方法來獲得選擇框,而無需手動實現鼠標偵聽器和繪畫代碼?
我正在使用Visual Studio 2010 MSVC編譯器在Windows 7 x64上使用Qt 4.8.4進行測試。
在瀏覽完QGraphicsScene API之后,我發現了一種手動解決選擇框的簡單方法:拖動模式需要設置為RubberBandDrag
。
編輯:
為了進一步擴展我的答案(允許在QGraphicsView上作其他用途的繪制),需要接收更新/重繪的是視口,而不是我的QGraphicsView對象。
void QSchematic::mouseMoveEvent(QMouseEvent *event)
{
if(making_selection_box)
{
// get selection box
qDebug() << "updating selection box";
curr_selection_end = event->pos();
viewport()->repaint(box(drag_select_start, curr_selection_end));
}
// propogate event
QGraphicsView::mouseMoveEvent(event);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.