3

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

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

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

4

3 回答 3

4

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

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

于 2012-06-21T20:52:28.907 回答
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;
   }));
}
于 2012-12-05T05:41:16.733 回答
0

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

来自:QT 文档

于 2012-06-21T14:46:40.627 回答