1

我正在学习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());
}
4

2 回答 2

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 回答
0

我认为更好的方法是让 Qgraphicsitem 从 QGraphicsItem 派生为您的 Image 并在 Mainwindow 的构造函数中添加一次。

scene->addItem(Myimageitem);

因此,通过这种方式,您无需在每次迭代后都执行此操作,并且每当调用更新时,您的图像都会自动更新。

于 2012-07-17T10:56:56.410 回答