CameraGrabber/mainwindow.cpp

138 lines
3.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
cam1 = new CamHandler("cam1",this);
cam2 = new CamHandler("cam2",this);
connect(cam1, &CamHandler::logMsg, this, &MainWindow::onLogPrint1);
connect(cam1, &CamHandler::imageReady, this, &MainWindow::picUpdate1);
connect(cam2, &CamHandler::logMsg, this, &MainWindow::onLogPrint2);
m_scene1 = new QGraphicsScene(this);
ui->graphicsView->setScene(m_scene1);
m_imageItem1 = nullptr; // 初始化图像项指针
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onLogPrint1(const QString &msg)
{
QDateTime currentDateTime = QDateTime::currentDateTime();
QString dateTimeString = currentDateTime.toString("yyyy--MM--dd HH-mm-ss");
ui->textBrowser->append(dateTimeString + " [cam1] --> " + msg);
}
void MainWindow::onLogPrint2(const QString &msg)
{
QDateTime currentDateTime = QDateTime::currentDateTime();
QString dateTimeString = currentDateTime.toString("yyyy--MM--dd HH-mm-ss");
ui->textBrowser->append(dateTimeString + " [cam2] --> " + msg);
}
void MainWindow::picUpdate1(const QImage &image)
{
// onLogPrint1("here rev");
if (image.isNull()) {
qWarning() << "Received null image.";
return;
}
// 1. QImage 转换为 QPixmap
// 注意:如果 QImage 引用了外部数据(例如:使用 CamHandler 中的 GetDataPointer()
// 务必使用 .copy() 或 QPixmap::fromImage() 来确保数据安全。
// 在您 CamHandler 的 convertPvBufferToQImage 中,您已经使用了 .copy(),这很好。
QPixmap pixmap = QPixmap::fromImage(image);
// 2. 将 QPixmap 放入 QGraphicsPixmapItem 中
if (m_imageItem1 == nullptr) {
// 第一次显示图像:创建 QGraphicsPixmapItem 并添加到 Scene
m_imageItem1 = m_scene1->addPixmap(pixmap);
// 可选:设置 Scene 的边界以匹配图像大小
m_scene1->setSceneRect(m_imageItem1->boundingRect());
// 可选:调整 QGraphicsView 视口以适应图像
// 如果您希望图像完整显示在 View 中,可以调用 fitInView
ui->graphicsView->fitInView(m_scene1->sceneRect(), Qt::KeepAspectRatio);
} else {
// 更新现有图像(更高效):直接更新 QGraphicsPixmapItem 的 QPixmap
m_imageItem1->setPixmap(pixmap);
}
// 强制 View 刷新,以防更新不及时
ui->graphicsView->viewport()->update();
}
void MainWindow::on_pushButton_2_clicked()
{
dc = new DialogCamSet(this);
dc->show();
}
void MainWindow::on_pushButton_3_clicked()
{
// QList<QString> tmp;
// tmp = CamHandler::listAvailableDevices();
// for(auto i: tmp){
// onLogPrint1(i);
// }
// cam1->connectToDevice("28B702523408");
if (!cam1->connectToDevice("28B702523408")) {
onLogPrint1("open failed");
return;
}
// if(!cam2->connectToDevice("1")){
// onLogPrint2("open failed");
// return;
// }
// cam2->startAcquisition();
}
void MainWindow::on_pushButton_4_clicked()
{
if (cam1->state) {
cam1->stopAcquisition();
} else {
onLogPrint1("Please connect firstly");
}
// cam2->stopAcquisition();
}
void MainWindow::on_pushButton_5_clicked()
{
ui->textBrowser->clear();
}
void MainWindow::on_pushButton_6_clicked()
{
if (cam1->state) {
cam1->startAcquisition();
} else {
onLogPrint1("Please connect firstly");
}
}
void MainWindow::on_pushButton_clicked()
{
cam1->saveFlag = true;
onLogPrint1("start saving ...");
}
void MainWindow::on_pushButton_7_clicked()
{
cam1->saveFlag = false;
onLogPrint1("stop saving ...");
}