2016-09-13 5 views
0

問題の最小の実例を書きましたが、Qtバグかもしれません。しかし、私が尋ねたがっている場合に備えて。ここでQDialogをexecまたはopenで開いた後、mousePressEventがQGraphicsItemにバグアウトするのはなぜですか?

は私のクラスです:

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のいずれかで開かれている場合は、閉じた後、画面上のマウスのクリックによってダイアログが再び開き、そこに描画された他のものと対話できなくなります。これは、最初に開かれた後にのみ発生します。私は、画面のサイズを変更すると、アイテムが再作成され、私は通常クリックすることができます。もう一度赤いボックスをクリックすると、画面の任意の場所をクリックするとダイアログが開きます

ダイアログが表示されていれば、それは正常に動作し、赤色をクリックすると再び表示されます矩形。

ここで明白な問題は、execがダイアログが閉じられるまでブロックを実行しますが、showは実行しないことです。私はシグナルを使ってこれをプログラムすることができますが、私の質問はなぜですか?これはバグですか?

答えて

0

mousePressEventのMyIndemの再実装には、デフォルトの実装で提供されるいくつかの動作が必要になると思われます。ここでコードは、私のマシンで正常に動作します:

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

ありがとうございます!あなたは私に多くの仕事を保存しました! – aarelovich

関連する問題