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



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

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

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

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

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

您可以使用 C++11 lambda 来解决此问题。创建一个新的通用"任何事件事件"QObject,通过您指定的 lambda 进行过滤。然后将此通用对象添加到具有所需逻辑的显示小部件中。例如:

generic-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);
};

generic-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;
   }));
}

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

来自: QT 文档

最新更新