簡體   English   中英

Qt麻煩與繪畫選擇框

[英]Qt Troubles with painting selection box

我在強制重新粉刷/更新Qt窗口小部件時遇到麻煩(它擴展了QGraphicsView類)。 我要繪制一個矩形選擇框,當用戶按下並移動鼠標時,該框將突出顯示目標選擇區域。

基本工作流程:

  1. MousePressEvent設置making_selection_box標志,並存儲起點(工作中)。
  2. MouseMoveEvent檢查是否需要更新顯示。 如果這樣做,它將嘗試這樣做(不起作用)。
  3. MouseReleaseEvent句柄獲取結果選擇框並進行相應的處理。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM