[英]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; }
警告:當paintdevice是一個小部件時,QPainter只能在paintEvent()函數內或paintEvent()調用的函數中使用; 除非設置了Qt :: WA_PaintOutsidePaintEvent小部件屬性。 在Mac OS X和Windows上,無論此屬性的設置如何,您都只能在paintEvent()函數中繪制。
如果你想在那個小部件上繪圖,你需要從它自己的paintEvent()中完成。
您可以在像素圖上繪制並在小部件繪制事件中繪制像素圖。 它可以是任何函數或槽,不一定是繪制事件,例如,您可以有多個用於繪制不同的對象。 您可以從像素圖上的任何位置進行繪制,使用繪制事件的要求僅適用於繪制像素圖的小部件。 如果它是一個復雜的場景,你甚至可以繪制另一個線程,只更新主線程中pixmap的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.