我正在学习Qt,遇到了一个我想不通的问题,所以想请教高手!
我正在开发一个应用程序,我希望有一个 QImage 对象(使用格式 QImage::Format_RGB888),并且能够使用 setPixel() 方法操作单个像素并使用 QImageWriter 保存图像......到目前为止,超好的。这一切都有效。
我展示这个 Qimage 的方式是 QMainWIdow 包含一个 QGraphicsView 对象,我创建了一个 QGraphicsScene,并在我的 MainWindow graphicsView 上设置了那个场景。
问题是我希望能够在 UI 上“实时”显示这个 QImage,这样用户就可以看到像素在被操纵时发生变化。目前,每次我想看到新的变化时,我都必须从图像中重新生成一个 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());
}