Qt: Использование QPainter для дочерних виджетов - PullRequest
4 голосов
/ 30 октября 2009

У меня проблема с Qt / C ++ с простой QWidget программой, которая рисует эллипс внутри дочернего элемента QWidget.

Программа состоит из:
(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, который, в свою очередь, находится внутри QVBoxLayout.

Есть предложения?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 30 октября 2009

Сначала я бы попытался установить фильтр событий на дочерний виджет (см. 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;
}
4 голосов
/ 30 октября 2009

Как указано в документации QPainter

Предупреждение. Когда устройство рисования является виджетом, QPainter можно использовать только внутри функции paintEvent () или в функции, вызываемой paintEvent (); это если только не установлен атрибут виджета Qt :: WA_PaintOutsidePaintEvent. В Mac OS X и Windows вы можете рисовать только в функции paintEvent () независимо от значения этого атрибута.

Если вы хотите рисовать на этом виджете, вам нужно сделать это из его собственного paintEvent ().

1 голос
/ 03 мая 2014

Вы можете нарисовать растровое изображение и нарисовать растровое изображение в событии рисования виджета. И это может быть любая функция или слот, не обязательно событие рисования, например Вы можете иметь несколько для рисования различных объектов. Вы можете рисовать в любом месте на растровом изображении, требование использования события рисования относится только к виджету, который будет рисовать растровое изображение Вы даже можете рисовать в другом потоке, если это сложная сцена, и обновлять результат только из растрового изображения в основном потоке.

...