为什么在用exec或open打开QDialog后,mousePressEvent到QGraphicsItem会出错?

时间:2016-09-13 10:59:44

标签: qt

我写了一个问题的最小工作示例,我相信它可能是一个Qt错误。但以防万一我想问。

以下是我的课程:

mydialog.h

#include <QDialog>
#include <QVBoxLayout>
#include <QLabel>

class MyDialog : public QDialog
{
public:
    MyDialog(QWidget *parent = 0);
};

mydialog.cpp

#include "mydialog.h"
MyDialog::MyDialog(QWidget *parent):QDialog(parent)
{
    QLabel *label = new QLabel("Some random dialog",this);
    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(label);
    this->setLayout(layout);
}

myitem.h

#include <QGraphicsTextItem>
#include <QPainter>
#include <QDebug>

#include "mydialog.h"

class MyItem : public QGraphicsItem
{
public:
    MyItem();
    void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0);
    QRectF boundingRect() const {return boundingBox;}

    void setMyDialog(MyDialog *d){ dialog = d; }

private:
    QRectF boundingBox;
    MyDialog *dialog;

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *e);
};

myitem.cpp

MyItem::MyItem()
{
    boundingBox = QRectF(0,0,200,100);
}

void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){

    painter->setBrush(QBrush(Qt::red));
    painter->drawRect(boundingBox);

}

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *e){
    //dialog->exec();  // BUG
    //dialog->open();  // BUG
    dialog->show();    // WORKS!
}

test.h

#include "myitem.h"

namespace Ui {
class Test;
}

class Test : public QMainWindow
{
    Q_OBJECT

public:
    explicit Test(QWidget *parent = 0);
    ~Test();

protected:
    void resizeEvent(QResizeEvent *e);

private:
    Ui::Test *ui;
    MyDialog *diag;
};

和test.cpp

Test::Test(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Test)
{
    ui->setupUi(this);
    ui->graphicsView->setScene(new QGraphicsScene(this));
    diag = new MyDialog(this);
}


void Test::resizeEvent(QResizeEvent *e){

    ui->graphicsView->setSceneRect(0,0,ui->graphicsView->width(),ui->graphicsView->height());
    ui->graphicsView->scene()->clear();

    MyItem *item = new MyItem();
    item->setMyDialog(diag);
    ui->graphicsView->scene()->addItem(item);

}

Test::~Test()
{
    delete ui;
}

所以这就是发生的事情(在Qt 5.7和Qt 5.6上测试)。如果使用exec或open打开对话框,则在关闭之后,所有进一步鼠标单击屏幕上的任何地方将再次打开对话框,从而无法与其中绘制的任何内容进行交互。这种情况仅在首次打开后才会发生。如果我调整屏幕大小,则重新创建项目,然后我可以再次正常点击。如果我再次单击红色框,则再次在屏幕上的任何位置再次单击以打开对话框

但是如果按show打开对话框,那么它按预期工作,只有在我点击红色矩形时再次显示。

现在明显的问题是exec使对话框块执行直到它关闭,但是show不会。我可以使用信号来编程,但我的问题是为什么?这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

似乎MyItem重新实现mousePressEvent需要默认实现提供的一些行为。这是代码,在我的机器上工作正常:

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event){
    dialog->exec();  // WORKS
    //dialog->open();  // WORKS
    //dialog->show();    // WORKS
    QGraphicsItem::mousePressEvent(event);
}