Qt обновляет изображение в пользовательском интерфейсе через обратный вызов - PullRequest
0 голосов
/ 08 мая 2020

У меня есть функция streamCamera(*callback), где обратный вызов - void callback(Image), которую можно использовать для предварительного просмотра потока в любой структуре пользовательского интерфейса, которую мы хотим.

Мне удалось выполнить потоковую передачу с помощью этой функции в opencv imshow window

void callback(image)
{
    cv::imshow("image", image);
    waitKey(1);
} 

, в то время как imshow является функцией stati c и может выполнять потоковую передачу.

Могу ли я сделать что-нибудь подобное с Qt?


То, что я пробовал,

У меня есть class MainWindow, который наследует QMainWindow, внутри класса я добавил QGraphicsPixmapItem pixImage в пользовательский интерфейс с помощью ui->graphicsView->scene()->addItem(&pixImage);

, поскольку pixImage недоступен для функции обратного вызова, потому что объект Mainwindow не является глобальным. Мне не удалось установить изображение в растровом изображении;

Итак, я закончил взлом, просто создал глобальный указатель QGraphicsPixmapItem *pixImagePtr и прикрепил pixImage перед запуском streamCamera(*callback) и внутри обратного вызова Я использую pixImagePtr для установки изображения GUI, а это сработало .

Но этот хак кажется неправильным способом, поэтому было бы полезно, если бы некоторые qt специалисты пролили на это некоторый свет.

1 Ответ

0 голосов
/ 08 мая 2020

Похоже на то, что нужно делать с сигналами.

Допустим, у вас есть классы MainWindow и Worker. Worker хочет показать какое-то изображение внутри MainWindow, вы можете сделать это следующим образом.

class MainWindow : public QMainWindow {
Q_OBJECT
// Other members
public slots:
    void showImage(const QPixmap &pixmap) {
        pixImage.setPixmap(pixmap);
    }
};


class Worker : public QObject {
Q_OBJECT
public:
    Worker(MainWindow* parent) : QObject{parent} {
        connect(this, &Worker::pixmapChanged,
                parent, &MainWindow::showImage);
    }

signals:
    void pixmapChanged(QPixmap pixmap);
}

Теперь внутри Worker вы должны иметь возможность использовать сигнал pixmapChanged для изменения MainWindow изображение вот так.

const QPixmap pixmap = getNewPixmap();
emit pixmapChanged(pixmap);
...