1

Qtを勉強していて、わからない問題に遭遇したので、専門家に尋ねたいと思います!

私は QImage オブジェクト (フォーマット QImage::Format_RGB888 を使用) を持ち、setPixel() メソッドで個々のピクセルを操作し、QImageWriter で画像を保存できるようにしたいアプリケーションに取り組んでいます...これまでのところ、とても良い。これはすべて機能します。

この Qimage を表示する私の方法は、QMainWIndow が QGraphicsView オブジェクトを含み、QGraphicsScene を作成し、そのシーンを MainWindow graphicsView に設定することです。

問題は、この QImage を UI に「ライブ」で表示できるようにしたいということです。ユーザーは、ピクセルが操作されているときにピクセルが変化するのを見ることができます。現在、新しい変更を表示するたびに、画像から QGraphicsPixmapItem を再生成し、シーンに addPixmap() を再生成する必要があります。

QImage をライブで表示して、加えられた変更をすぐに確認する方法はありますか? イメージを保持および/または表示するために間違ったオブジェクトを使用していませんか?

簡単な例が添付されています(mainwindow.cppの部分だけ...他のファイルはデフォルトのものです)。この UI には、(QImage の変更をトリガーするための) ボタンと、画面に QImage を表示する場所があります。

インターネットを検索しましたが、関連すると思われる投稿に出くわしませんでした。誰か提案があれば、聞いていただければ幸いです。ありがとう、

-エリック

QGraphicsScene *scene = NULL;
QGraphicsItem *line = NULL;
QImage *image = NULL;
QGraphicsPixmapItem *item = NULL;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    scene = new QGraphicsScene();
    image = new QImage(60, 60, QImage::Format_RGB888 );

    image->fill(Qt::cyan);

    ui->retranslateUi(this);
    ui->graphicsView->setScene(scene);
    ui->graphicsView->show();

    line = (QGraphicsItem*) scene->addLine( QLine( 20, 40, 300, 100 ),
                    QPen(Qt::red, 6, Qt::DashLine, Qt::FlatCap));
    scene->setBackgroundBrush(QBrush(Qt::green, Qt::SolidPattern));
    scene->addEllipse(40, 80, 300, 240,
                        QPen(Qt::blue, 10, Qt::DashDotDotLine, Qt::RoundCap));

    item = new QGraphicsPixmapItem(QPixmap::fromImage(*image));
    scene->addPixmap(item->pixmap());

    // Connect the pushbutton to the buttonPressed method, below.
    connect(    ui->pushButton, SIGNAL(pressed()),
                this, SLOT( buttonPressed() ) );
}

// Slot connected to the button being pressed.
// Manipulate some pixels, and show the results.
void MainWindow::buttonPressed()
{
    printf("Now in buttonPressed...\n");
    int x, y;
    int offset = qrand();
    QRgb px;

    px = qRgb(20+offset, 10-offset, 30+offset);

    for (x=0; x< 60; x++)
        for(y=0; y< 60; y++)
        {
            image->setPixel(x, y, px );
        }
    // I'd like to NOT have to re-convert the image every time.
    item = new QGraphicsPixmapItem(QPixmap::fromImage(*image));
    scene->addPixmap(item->pixmap());
}
4

2 に答える 2

0

より良い方法は、イメージの QGraphicsItem から派生した Qgraphicsitem を作成し、この項目を Mainwindow のコンストラクターに一度追加することだと思います。

scene->addItem(Myimageitem);

したがって、この方法では、繰り返しのたびにそれを行う必要はなく、更新が呼び出されるたびに画像が自動的に更新されます。

于 2012-07-17T10:56:56.410 に答える
0

Qpixmap::fromImage を使用して所定の位置にピックスマップを作成することにより、QLabel に直接描画することができます。

または、QWidget から派生させてペイント イベントをオーバーロードすることで、onw 画像表示ウィジェットを作成することもできます。

void DisplayWidget::paintEvent(QPaintEvent*)
{

  QPainter p(this);
  p.drawImage(m_image); // you can also specfy a src and dest rect to zoom
}   
于 2012-07-14T17:39:10.550 に答える