Qt paintEvent我可以在子窗口小部件上绘画吗?

时间:2012-06-21 14:08:58

标签: qt

我有一个QMainWindow的widget类子类,它有一个中央窗口小部件(QWidget),在重写的paintEvent函数中,我可以在这个中央窗口小部件上创建一个QPainter实例吗?代码如:

void MyMainWindow::paintEvent(QEvent *event)
{
    QPainter painter(_theCentralWidget);
    //drawing...
    return QMainWindow::paintEvent(event);
}

我不想创建QWidget的新c ++类子类并覆盖其paintEvent函数,然后用这个新的替换原始的中央窗口小部件... (我确实喜欢上面但发生错误,说画家不活跃......)

3 个答案:

答案 0 :(得分:3)

好。如果你真的,真的,真的不想对中央小部件进行子类化,你可以为它安装一个事件过滤器并为它处理paint事件。

http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter

答案 1 :(得分:3)

您可以使用C ++ 11 lambdas来解决此问题。创建一个新的通用“任何事件的事件”QObject,它通过你指定的lambda传递它的过滤。然后使用所需的逻辑将此通用对象添加到显示窗口小部件。例如:

仿制QEVENT-filter.hpp:

#pragma once

class GenericQEventFilter : public QObject
{
  Q_OBJECT

public:
  GenericQEventFilter(QObject *parent, std::function<bool (QObject *obj, QEvent *event)> event_filter_f);
  std::function<bool (QObject *obj, QEvent *event)> event_filter_f;

protected:
  bool eventFilter(QObject *obj, QEvent *event);

};

仿制QEVENT-filter.cpp:

#include "generic-qevent-filter.hpp"

GenericQEventFilter::GenericQEventFilter(QObject *parent, 
                     std::function<bool (QObject *obj, QEvent *event)> event_filter_f)
  : QObject(parent), event_filter_f(event_filter_f)
{
}


bool GenericQEventFilter::eventFilter(QObject *obj, QEvent *event)
{
  return this->event_filter_f(obj, event); 
}

您可以在代码中使用它,如下所示:

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{ 
   ui = new Ui_MainWindow();
   ui->setupUi(this); // Initialise widgets
   this->wire_up_gui(); // Connect signals and slots

   ui->displayWidget->installEventFilter(new GenericQEventFilter(this, [&] (QObject *obj, QEvent *event) {
     if(event->type() == QEvent::Paint) {
       paint_display_widget(obj, event);
       return true;
     }
     return false;
   }));
}

答案 2 :(得分:0)

“警告:当paintdevice是一个小部件时,QPainter只能在paintEvent()函数内或paintEvent()调用的函数中使用;除非设置了Qt :: WA_PaintOutsidePaintEvent小部件属性。在Mac OS上在X和Windows中,无论此属性的设置如何,都只能在paintEvent()函数中绘制。“

来自:QT Docu