我有一个QMainWindow的widget类子类,它有一个中央窗口小部件(QWidget),在重写的paintEvent函数中,我可以在这个中央窗口小部件上创建一个QPainter实例吗?代码如:
void MyMainWindow::paintEvent(QEvent *event)
{
QPainter painter(_theCentralWidget);
//drawing...
return QMainWindow::paintEvent(event);
}
我不想创建QWidget的新c ++类子类并覆盖其paintEvent函数,然后用这个新的替换原始的中央窗口小部件... (我确实喜欢上面但发生错误,说画家不活跃......)
答案 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