3

私はまだ Qt を学んでいます。Qt で小さなプロジェクトを行いました。qt ui デザイナーを使用してシンプルな ui を作成し、QGraphicsView を使用して QFileDialog によって読み込まれた画像を表示しましたが、読み込まれた画像ファイルを QgraphicsScene に追加すると、画像が表示されません。グラフィックビューに表示されます。グラフィックビューは空白のままです。助けてください、ありがとう!

 Project2::Project2(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui = new Ui::Project2Class;
ui->setupUi(this);

this->scene = new QGraphicsScene;

this->scene->setSceneRect(0, 0, 649, 459);

connect(ui->mapLoaderButton, SIGNAL(clicked()), this, SLOT(GetfilePath()));


ui->graphicsView->setScene(this->scene);    
}


 void Project2::GetfilePath()
   {

    QString filePath = QFileDialog::getOpenFileName(this, tr("Select file"), "", tr("Files (*.jpg*)"));

    if (filePath.isNull() == false)
    {
    QImage image(filePath);

    QSize size = image.size();
    ui->graphicsView->scene()->addItem(&QGraphicsPixmapItem(QPixmap::fromImage(image)));
    ui->graphicsView->scene()->update();
    ui->graphicsView->viewport()->update();
}}
4

1 に答える 1

3

QGraphicsScene、および Qt のほとんどは、変数の所有権を取得します。変数は動的に割り当てる必要があります。

スタック上に作成された変数は、有効期間が短すぎて QObject が後でそれらを削除しようとするため、機能しません。

「new」で QGraphicsPixmapItem を作成する必要があります。

ui->graphicsView->scene()->addItem(new QGraphicsPixmapItem(QPixmap::fromImage(image)));

QObjectから継承するものはすべて、他のQObjectクラスを所有 (および所有)できます。QObjectが破棄されると、そのすべての子に対して「delete」が呼び出されます。QObjectクラスは、自分の子を「所有」したいと考えています。「所有する」とは、の寿命を制御することを意味します。

あなたの場合、スタック上にQObject (QGraphicsPixmapItem) を作成していました。その後、そのライフタイムはスタックによって制御されます (ただし、QObjectはそれを制御していると考えます)。スタックは、その ' addItem() ' 関数呼び出しのセミコロンに到達するまでにそれを削除します。

一般的な C++ の経験則として、関数がポインターを要求している場合は、一時的な (名前のない) オブジェクトを渡さないでください。一般的な Qt の経験則として、関数がポインターを要求している場合は、名前付きのローカル変数を指定しないでください。ほとんどの場合、動的に割り当てられた変数が必要なため、ドキュメントで関数を調べて、 「所有権を取得する」と述べています。もしそうなら、それを ' new ' し、後で Qt に ' delete ' させます。

于 2013-03-06T01:40:10.990 に答える