我是Qt的新手。我试图抓住鼠标按下并在QGraphicsView
区域释放并画一条线。为此,我扩展了QGraphicsView
并将其称为myQGraphicsView
。由于我添加了一个" Hello World "似乎没有正确附加场景。它永远不会出现在视图中。这是我的扩展类的代码:
class myQGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
myQGraphicsView(QGraphicsScene *scene, QWidget *parent = Q_NULLPTR) : QGraphicsView(scene,parent){
// QGraphicsView::QGraphicsView(scene,parent);
}
QPoint *pointPtr, *startPos,*endPos;
QGraphicsView *cv;//MAA
QGraphicsScene *c;
QGraphicsScene *scenePtr; // MAA
protected:
void paintEvent(QPaintEvent *event) {
show();
}
void mousePressEvent(QMouseEvent *event) {
// pos is wrt widget. Global is wer to global screen
qDebug()<<" Mouse pressed at "<<QWidget::mapFromGlobal(event->globalPos()); //globalX();
startPos = new QPoint;
startPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
startPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());
}
void mouseReleaseEvent(QMouseEvent *event) {
qDebug()<<" Mouse relase pressed at x="<<event->globalPos().x()<<" y ="<<event->globalPos().y();
endPos = new QPoint;
endPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
endPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());
c->addLine(0,0,50,50);
update();
}
void mouseMoveEvent ( QMouseEvent * event )
{
//Show x and y coordinate values of mouse cursor here
qDebug()<<"X:"<<QString::number(event->x())<<"-- Y:"<<QString::number(event->y());
endPos = new QPoint;
}
}
似乎检测到鼠标并调用正确的方法。但是,&#34; hello world &#34;也不会在视图中绘制线条。我在视图上尝试了cv1->setScene
,但也没有做任何事情。
所以我声明了一个名为cv2
的第二个视图指针,它正在使用QGraphicsView
。所有的信息似乎在那里工作得很好,它会被淹死。我仔细阅读了帖子,似乎他们建议设置事件过滤器,因此我将其添加到两个视图中(cv1
和cv2
)。事件过滤器只返回所有事件的false
(这应该是文档中的默认行为)。它没有做任何事情。
以下是cv1
和cv2
的great.cpp中的代码段。请注意,在cv1
(mymyQGraphicsView
实例)中,我创建了一个指向场景的指针(称为c
)并被分配c1
,因此我可以addLine
到它。
c1 = new QGraphicsScene(0,0,500,300,this);
text= c1->addText("Hello, world!");
text->setFlag(QGraphicsItem::ItemIsMovable);
text->setVisible(true);
cv1 = new myQGraphicsView(c1,this);
cv2= new QGraphicsView(c1,this);
KeyPressEater *keyPressEaterPtr = new KeyPressEater(this);
cv1->installEventFilter(keyPressEaterPtr);
cv2->installEventFilter(keyPressEaterPtr);
cv1->c =c1;
layout = new QGridLayout;
layout->addWidget(topLabel,0,0);
layout->addWidget(wellCoord,1,0);
layout->addWidget(cv1,1,1,1,-1); <-view is added to a great class
layout->addWidget(TimeStepGroup,2,0);
setLayout(layout);
最后,这里是great.h:
myQGraphicsView *cv1;//MAA
QGraphicsView *cv2;//MAA
QGraphicsScene *c1; // MAA
public:
void paintEvent(QPaintEvent *event) {
// MAA
cv2->show();
}
protected:
void mousePressEvent(QMouseEvent *event) {
qDebug()<<"gridwell Mouse pressed at "<<QWidget::mapFromGlobal(event->globalPos()); //globalX();
startPos = new QPoint;
startPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
startPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());
QWidget::mousePressEvent(event);
}
void mouseReleaseEvent(QMouseEvent *event) {
qDebug()<<"gridwell Mouse released at x="<<event->globalPos().x()<<" y ="<<event->globalPos().y();
QWidget::mouseReleaseEvent(event);
endPos = new QPoint;
endPos->setX(QWidget::mapFromGlobal(event->globalPos()).x());
endPos->setY(QWidget::mapFromGlobal(event->globalPos()).y());
lineItemPtr = c1->addLine(startPos->x(),startPos->y(),(endPos->x())- (startPos->x()),(endPos->y())-(startPos->y()) );
lineItemPtr->setVisible(true);
cv2->update();
}
void mouseMoveEvent ( QMouseEvent * event )
{
//Show x and y coordinate values of mouse cursor here
qDebug()<<"gridwell X:"<<QString::number(event->x())<<"-- Y:"<<QString::number(event->y());
endPos = new QPoint;
}
最后,这是我从文档中剪切并粘贴的keyEater
:
class KeyPressEater : public QObject
{
Q_OBJECT
public:
KeyPressEater(QObject *parent = Q_NULLPTR) : QObject (parent){
}
protected:
bool eventFilter(QObject *obj, QEvent *event)
{
return(false); // propagates events
}
};
为什么cv1
没有得到场景c1
的任何想法(因为它甚至不打印&#34; hello world &#34;。但是{{1做什么?
感谢您的帮助!
更新:我做了更多调查并更改了以下例程:
cv2
现在,当我在cv1视图区域内单击时,我看到cv2中的行,因为cv2和cv1视图都指向同一个场景(cv1-&gt; c = c1;在great.cpp中的行)。这证明了在cv2中没有正确映射场景,因为即使是&#34; Hello World&#34;出现。我很困惑,因为这似乎是一个简单的对象传递给构造函数,如许多例子所示。