2009-10-30 108 views
4

我有一個簡單的QWidget程序在兒童QWidget內繪製橢圓的Qt/C++問題。Qt:在子窗口小部件上使用QPainter

該程序由以下組成:
(1)一種親QWidget
(2)的兒童QWidget(用作繪圖表面爲橢圓形)
(3)繪製QPushButton

下面是代碼(QPushButton插槽和信號代碼爲簡單起見省略)的一部分

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);不做任何事情。該程序只在將第2行替換爲painter.begin(this);,而是根據需要使用父代QWidget而不是子代QWidget來繪製橢圓。

P.S.我將child_Widget安置在GroupBox內,而GroupBox又位於QVBoxLayout的內部。

有何建議?

謝謝。

回答

4

QPainter documentation

警告指出:當paintdevice是一個小部件,QPainter的只能一個的paintEvent()函數內或在一個通過的paintEvent調用的函數使用的();那就是除非設置了Qt :: WA_PaintOutsidePaintEvent小部件屬性。在Mac OS X和Windows上,只能在paintEvent()函數中繪製,而不管此屬性的設置如何。

如果你想繪製那個小部件,你需要從它自己的paintEvent()中去做。

+0

linuxman,我該怎麼做到這一點?我最初在其自己的類中有一個子部件作爲在父部件類中實例化的渲染區域,但我最終將這兩部分合併爲一個類b/c,我需要渲染區域來訪問父部件類的成員,並且使用friend關鍵字不起作用。 另外還有另一個設備(除了QWidget),我可以使用QPainter繪製橢圓w/out? – 2009-10-30 01:43:29

+2

通過繼承它並重新實現它的paintEvent()函數。 – linuxman 2009-10-30 01:57:23

6

我想嘗試的第一件事就是在子窗口小部件上安裝一個事件過濾器(請參閱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; 
} 
1

你可以畫上一個像素圖,繪製在小部件油漆事件的像素圖。它可以是任何功能或插槽,不一定是繪畫事件,例如,你可以有多個繪製不同的對象。您可以在像素圖的任何位置繪製,要求使用繪畫事件僅用於繪製像素圖的小部件。如果它是一個複雜的場景,你甚至可以在另一個線程中繪製,並且只更新主線程中像素圖的結果。

相關問題