mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsVideoItem>
#include <QGraphicsTextItem>
#include <QCamera>
#include <QPushButton>
#include <ui_mainwindow.h>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onButtonClicked();
private:
void resizeEvent(QResizeEvent *event) override;
Ui::MainWindow *ui; // 声明 ui 指针
QCamera *camera;
QGraphicsScene *scene;
QGraphicsView *view;
QGraphicsVideoItem *videoItem;
QGraphicsPixmapItem *pixmapItem;
QGraphicsTextItem *textItem;
QPushButton *changeTextBtn;
int textCounter = 1;
};
#endif // MAINWINDOW_H
mainwindow.cpp文件
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QResizeEvent>
#include <QCameraInfo>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//使用Qt开发一个简单界面,将摄像头的视频流在界面中显示。
//在视频流中叠加小图片和简单文字,如hello world,可以通过按钮改变叠加的内容 如从hello world 变为hello world 1。
//功能需求
// 1.初始化摄像头
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
if (cameras.isEmpty()) {
qDebug() << "未找到摄像头!";
return;
}
camera = new QCamera(cameras.first(), this);
// 2.初始化视频渲染项
videoItem = new QGraphicsVideoItem;
camera->setViewfinder(videoItem);
// 初始化场景和视图
scene = new QGraphicsScene(this);
view = new QGraphicsView(scene);
scene->addItem(videoItem);
// 3.添加叠加图片
pixmapItem = new QGraphicsPixmapItem(QPixmap(":/1.jpg"));
pixmapItem->setPos(20, 20);
scene->addItem(pixmapItem);
// 添加文字项
textItem = new QGraphicsTextItem("Hello World");
QFont font = textItem->font();
font.setPointSize(24);
font.setBold(true);
textItem->setFont(font);
textItem->setDefaultTextColor(Qt::white);
textItem->setPos(20, 300);
scene->addItem(textItem);
// 添加按钮
changeTextBtn = new QPushButton("更改文字为 Hello World 1", this);
connect(changeTextBtn, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
// 布局设置
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(view);
mainLayout->addWidget(changeTextBtn);
QWidget *centralWidget = new QWidget;
centralWidget->setLayout(mainLayout);
setCentralWidget(centralWidget);
// 启动摄像头
camera->start();
}
MainWindow::~MainWindow()
{
camera->stop();
}
void MainWindow::onButtonClicked()
{
//标记文本
textCounter++;
textCounter%=2;
textItem->setPlainText(QString("Hello World %1").arg(textCounter));
changeTextBtn->setText(QString("更改文字为 Hello World %1").arg(textCounter));
// 文字居中
QRectF textRect = textItem->boundingRect();
textItem->setPos((view->viewport()->width() - textRect.width()) / 2,
(view->viewport()->height() - textRect.height()) / 2);
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
QMainWindow::resizeEvent(event);
if (textItem && view) {
QRectF textRect = textItem->boundingRect();
textItem->setPos((view->viewport()->width() - textRect.width()) / 2,
(view->viewport()->height() - textRect.height()) / 2);
}
}
为什么程序组后输出,捕捉的摄像头画面没有,摄像头是正确的
