我正在嘗試為橡皮筋矩形放大設定事件過濾器。但出現以下錯誤
widget.cpp:29:42:錯誤:無法將“SchematicDesign”轉換為其私有基類“QObject”schematicdesign.h:13:68:注意:此處受隱式私有繼承的約束
小部件.h
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QGraphicsView
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QGraphicsScene* scene;
QGraphicsView* view;
};
#endif // WIDGET_H
小部件.cpp
Widget::Widget(QWidget *parent)
: QGraphicsView(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
view = new QGraphicsView(this);
view->setScene(scene);
view->setContextMenuPolicy(Qt::CustomContextMenu);
view->setDragMode(QGraphicsView::RubberBandDrag);
view->setBackgroundBrush(Qt::gray);
view->viewport()->installEventFilter(new SchematicDesign()); //Error
}
原理圖設計.h
class SchematicDesign : public QGraphicsRectItem
public:
explicit SchematicDesign();
explicit SchematicDesign(qreal x, qreal y, qreal width, qreal height,QGraphicsItem *parent = nullptr)
: QGraphicsRectItem(x, y, width, height, parent)
{}
public:
bool eventFilter(QObject *watched, QEvent *event);
};
原理圖設計.cpp
SchematicDesign::SchematicDesign(){}
bool SchematicDesign::eventFilter(QObject *watched, QEvent *event)
{
bool filterEvent = false;
switch(event->type()) {
case QEvent::MouseButtonPress:
{
QMouseEvent * mouseEvent = static_cast<QMouseEvent *>(event);
rubberBandOrigin = mouseEvent->pos();
rubberBandActive = true;
break;
}
case QEvent::MouseButtonRelease:
{
if (rubberBandActive) {
QMouseEvent * mouseEvent = static_cast<QMouseEvent *>(event);
QPoint rubberBandEnd = mouseEvent->pos();
QGraphicsView * view = static_cast<QGraphicsView *>(watched->parent());
QRectF zoomRectInScene = QRectF(view->mapToScene(rubberBandOrigin),
view->mapToScene(rubberBandEnd));
view->fitInView(zoomRectInScene, Qt::KeepAspectRatio);
rubberBandActive = false;
}
break;
}
}
return filterEvent;
}
如何解決這個問題?任何幫助將不勝感激。
uj5u.com熱心網友回復:
QGraphicsRectItem 不是從 QObject 繼承的,所以installEventFilter不會起作用。
您需要覆寫sceneEvent(或者sceneEventFilter,如果您確實想要一個過濾器,但似乎您可能只希望 SchematicDesign 自己處理事件)并使用installSceneEventFilter. 從檔案中:
您可以通過安裝事件過濾器來過濾任何其他專案的事件。此功能與 Qt 的常規事件過濾器(參見 QObject::installEventFilter())是分開的,后者僅適用于 QObject 的子類。通過呼叫 installSceneEventFilter() 將您的專案安裝為另一個專案的事件過濾器后,過濾后的事件將由虛擬函式 sceneEventFilter() 接收。您可以通過呼叫 removeSceneEventFilter() 來洗掉專案事件過濾器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434945.html
