簡體   English   中英

Qt:在子窗口小部件上使用QPainter

[英]Qt: Using QPainter on child widgets

我有一個簡單的QWidget程序的Qt / C ++問題,該程序在子QWidget中繪制一個橢圓。

該計划包括:
(1)父QWidget
(2)子QWidget (用作橢圓的繪圖表面)
(3)繪制QPushButton

以下是代碼的一部分(為簡單起見省略了QPushButton Slot和Signal代碼)

void Draw::paintEvent(QPaintEvent *event) {
    QPainter painter;
    painter.begin(child_Widget);    //The line with the problem
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    painter.drawEllipse(50, 50, 100, 100);
    painter.end();}

第2行painter.begin(child_Widget); 什么都不做 只有當我用painter.begin(this);替換第2行時,程序才會繪制橢圓painter.begin(this); 但這取決於父QWidget而不是根據需要在子QWidget

PS我將child_Widget放在GroupBox中,而GroupBox又放在QVBoxLayout

有什么建議嗎?

謝謝。

我要嘗試的第一件事是在子窗口小部件上安裝一個事件過濾器(參見QObject :: installeEventFilter() ),然后在父窗口小部件中繪制QEvent :: Paint事件,並在那里進行繪制。

在哪里創建子窗口小部件:

// ...
    childWidget = new QWidget(this);
    childWidget->installEventFilter(this);
// ...

然后在父母:

bool Draw::eventFilter(QObject* watched, QEvent* event)
{
    if (watched == childWidget && event->type() == QEvent::Paint) {
        QPainter painter;
        painter.begin(childWidget);
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
        painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
        painter.drawEllipse(50, 50, 100, 100);
        painter.end();
        return true; // return true if you do not want to have the child widget paint on its own afterwards, otherwise, return false.
    }
    return false;
}

QPainter文檔中所述

警告:當paintdevice是一個小部件時,QPainter只能在paintEvent()函數內或paintEvent()調用的函數中使用; 除非設置了Qt :: WA_PaintOutsidePaintEvent小部件屬性。 在Mac OS X和Windows上,無論此屬性的設置如何,您都只能在paintEvent()函數中繪制。

如果你想在那個小部件上繪圖,你需要從它自己的paintEvent()中完成。

您可以在像素圖上繪制並在小部件繪制事件中繪制像素圖。 它可以是任何函數或槽,不一定是繪制事件,例如,您可以有多個用於繪制不同的對象。 您可以從像素圖上的任何位置進行繪制,使用繪制事件的要求僅適用於繪制像素圖的小部件。 如果它是一個復雜的場景,你甚至可以繪制另一個線程,只更新主線程中pixmap的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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