Qt彈出電腦能利用的攝像頭並選擇兩個做展示

使用雙目攝像頭,然後我就想能不能人工進行選擇,以下就是代碼:

    QList<QCameraInfo> m_camera;
    QList<QCamera*> m_cameraList; 
    foreach(QCameraInfo info, QCameraInfo::availableCameras()) {
		m_camera.append(info);
	}
	QDialog* camerasSelectDialog = new QDialog(this);
	camerasSelectDialog->setMinimumWidth(950);
	camerasSelectDialog->setWindowTitle(tr("Select your disired cameras"));
	QGridLayout* camerasSelectDialogLayout = new QGridLayout();
	QLabel* leftLabel = new QLabel(tr("Left"));
	QLabel* rightLabel = new QLabel(tr("Right"));
	QButtonGroup* leftCameraButtonGroup = new QButtonGroup(this->camerasSelectDialog);
	QButtonGroup* rightCameraButtonGroup = new QButtonGroup(this->camerasSelectDialog);
	camerasSelectDialogLayout->addWidget(leftLabel, 1, 0);
	camerasSelectDialogLayout->addWidget(rightLabel, 2, 0);
	for (int i = 0; i < m_camera.count(); i++) {
		QWidget* wid = new QWidget(this->camerasSelectDialog);
		wid->setFixedSize(400, 300);
		QCamera* camera = new QCamera(m_camera.at(i));
		QCameraViewfinder* viewfinder = new QCameraViewfinder(wid);
		viewfinder->setFixedSize(wid->size());
		camera->setViewfinder(viewfinder);
		m_cameraList << camera;
		m_cameraList.at(i)->start();
		camerasSelectDialogLayout->addWidget(wid, 0, i + 1);
		QRadioButton* optionalLeftCameraRadioButton = new QRadioButton(this->m_camera.at(i).description());
		leftCameraButtonGroup->addButton(optionalLeftCameraRadioButton, i);
		QRadioButton* optionalRightCameraRadioButton = new QRadioButton(this->m_camera.at(i).description());
		rightCameraButtonGroup->addButton(optionalRightCameraRadioButton, i);
		if (i == 0) {
			optionalLeftCameraRadioButton->setChecked(true);
			optionalRightCameraRadioButton->setChecked(true);
		}
		camerasSelectDialogLayout->addWidget(optionalLeftCameraRadioButton, 1, i+1);
		camerasSelectDialogLayout->addWidget(optionalRightCameraRadioButton, 2, i+1);
	}
	QDialogButtonBox* button = new QDialogButtonBox(camerasSelectDialog);
	button->addButton(tr("OK"), QDialogButtonBox::YesRole);
	button->addButton(tr("Cancel"), QDialogButtonBox::NoRole);
	connect(button, SIGNAL(accepted()), camerasSelectDialog, SLOT(accept()));
	connect(button, SIGNAL(rejected()), camerasSelectDialog, SLOT(reject()));
	camerasSelectDialogLayout->addWidget(button, 3, 0, 1, -1);
	camerasSelectDialog->setLayout(camerasSelectDialogLayout);
	auto res = camerasSelectDialog->exec();
	for (int i = 0; i < m_cameraList.count(); i++)m_cameraList.at(i)->stop();
	if (res == QDialog::Accepted) {
		int leftCameraId = leftCameraButtonGroup->checkedId();
		int rightCameraId = rightCameraButtonGroup->checkedId();
		m_cameraList.clear();
		qDeleteAll(m_cameraList);
		QCamera* leftCamera = new QCamera(m_camera.at(leftCameraId));
		QCamera* rightCamera = new QCamera(m_camera.at(rightCameraId));
		CamerasShowWidget* camerasShowWidget = new CamerasShowWidget(leftCamera, rightCamera);
		camerasShowWidget->show();
        m_camera.clear();
	}
	else {
		m_camera.clear();
		m_cameraList.clear();
		qDeleteAll(m_cameraList);
	}

界面如下圖所示

CamerasShowWidget.cpp代碼   .h代碼應該能相應寫出,在此就不展示了。

#include "CamerasShowWidget.h"
#include <QCameraViewfinder>
#include <QHBoxLayout>

CamerasShowWidget::CamerasShowWidget(QCamera* leftCamera, QCamera* rightCamera, QWidget* parent) :QWidget(parent) {
	this->setWindowTitle(tr("Cameas"));
	QHBoxLayout* camerasShowWidgetLayout = new QHBoxLayout();
	QWidget* leftWidget = new QWidget(this);
	QWidget* rightWidget = new QWidget(this);
	this->leftCamera = leftCamera;
	this->rightCamera = rightCamera;
	QCameraViewfinder* leftViewfinder = new QCameraViewfinder(leftWidget);
	QCameraViewfinder* rightViewfinder = new QCameraViewfinder(rightWidget);
	this->leftCamera->setViewfinder(leftViewfinder);
	this->rightCamera->setViewfinder(rightViewfinder);
	this->leftCamera->start();
	this->rightCamera->start();
	QList<QCameraViewfinderSettings> leftViewSets = this->leftCamera->supportedViewfinderSettings();
	QList<QCameraViewfinderSettings> rightViewSets = this->rightCamera->supportedViewfinderSettings();
	this->leftCamera->setViewfinderSettings(leftViewSets[0]);
	this->rightCamera->setViewfinderSettings(rightViewSets[0]);
	leftWidget->setFixedSize(leftViewSets[0].resolution());
	rightWidget->setFixedSize(rightViewSets[0].resolution());
	camerasShowWidgetLayout->addWidget(leftWidget);
	camerasShowWidgetLayout->addWidget(rightWidget);
	this->setLayout(camerasShowWidgetLayout);
}

void CamerasShowWidget::closeEvent(QCloseEvent* e) {
	delete this->leftCamera;
	delete this->rightCamera;
	this->leftCamera = NULL;
	this->rightCamera = NULL;
}

在上面那個界面中選擇第二個攝像頭作爲左攝像頭和第三個攝像頭作爲右攝像頭之後,點擊確定出現如下界面。

參考鏈接:

QCamera同時打開多個USB攝像頭小Demo

發佈了48 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章