問題の最小の実例を書きましたが、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は実行しないことです。私はシグナルを使ってこれをプログラムすることができますが、私の質問はなぜですか?これはバグですか?
ありがとうございます!あなたは私に多くの仕事を保存しました! – aarelovich