我正在学习Qt,并且遇到了一个我无法解决的问题,所以我想问专家!
我正在开发一个应用程序,我希望有一个QImage对象(使用格式QImage :: Format_RGB888),并且能够使用setPixel()方法操作单个像素&使用QImageWriter保存图像......到目前为止,非常好。一切正常。
我显示这个Qimage的方式是QMainWIndow包含一个QGraphicsView对象,我创建了一个QGraphicsScene,并在我的MainWindow graphicsView上设置了该场景。
问题在于我希望能够在UI" live"上显示此QImage,以便用户可以在操作时看到像素发生变化。 目前,我必须从图像重新生成QGraphicsPixmapItem,并且每次我想看到新的更改时,都会重新添加Pixmap()到场景中。
有没有办法查看实时的QImage,以便立即看到所做的更改?我使用错误的物体来保存和/或显示我的图像吗?
我附上了一个简单的例子(只是mainwindow.cpp部分......其他文件只是默认的东西)。此UI只有一个按钮(用于触发QImage更改),并在屏幕上显示QImage。
我已经搜索过互联网,但没有发现任何看似相关的帖子。 如果有人有任何建议,我很感激听到他们! 感谢,
-Eric
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());
}
答案 0 :(得分: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
}
答案 1 :(得分:0)
我认为更好的方法是让Qgraphicsitem从你的Image的QGraphicsItem派生,并在Mainwindow的构造函数中添加一次。
scene->addItem(Myimageitem);
所以这样你就不需要在每次迭代后都这样做,每当调用更新时,你的图像都会自动更新。