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());
}