Qt - 有没有办法在UI上查看“实时”QImage?

时间:2012-07-14 17:33:18

标签: qt user-interface qimage

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

2 个答案:

答案 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);

所以这样你就不需要在每次迭代后都这样做,每当调用更新时,你的图像都会自动更新。