赞
踩
1、开发环境
vs2017
Qt5.12.5
opencv4.0
海康相机sdk
链接:https://pan.baidu.com/s/1QsOskg9hAjOK0pC1hDqaqA 提取码:zfkk
自行安装
2、预备知识
本节我们将学习Qt的基本操作,本项目需要使用的主要的知识:信号与槽机制、多线程,下面通过两个简单的例子熟悉QtCreator开发环境。
介绍:Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序。
2.1 第一个程序 :hello World
单击 Qt Creator 的菜单项
文件->新建文件或项目
,出现如图 1 所示的对话框。在这个对话框里选择需要创建的项目或文件的模板。
项目管理与文件编辑界面
点击Start debugging of startup project运行一下,会弹出一个空白的窗口。
接下来我们将在该空白窗口中添加各种所需要的控件。
双击文件目录树中的文件 demowidget1.ui,出现如图10所示的窗体设计界面.
简单介绍的我们需要使用的界面控件。
Push Button:普通按钮
Label:可以显示文字、图片、动图。
Line Edit : 单行文本编辑框,可以输入单行文本;
再次Debug,Qt会自动帮我们生成界面Ui相关的C++代码
下面要实现两个功能:
1、点击bnt_click后在label_display中显示“ Hello World!!”
2、在lineEdit_input输入字符串就在label_display中显示该字符串。
信号与槽机制
信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。
信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。
GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
下面实现第一个功能
首先声明槽函数
#ifndef DEMOWIDGET1_H #define DEMOWIDGET1_H #include <QWidget> QT_BEGIN_NAMESPACE namespace Ui { class DemoWidget1; } QT_END_NAMESPACE class DemoWidget1 : public QWidget { Q_OBJECT public: DemoWidget1(QWidget *parent = nullptr); ~DemoWidget1(); private: Ui::DemoWidget1 *ui; // 声明我们的槽函数 public slots: void on_bnt_click(); // PushButton按键响应的槽函数 void on_lineEdit_input(); // lineEdit输入响应的槽函数 }; #endif // DEMOWIDGET1_H然后定义槽函数
多线程(重点!敲黑板)
mythread.h
#ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QWidget> #include <QThread> class Mythread : public QThread { Q_OBJECT public: explicit Mythread(QObject *parent = nullptr); public: void run(); public: int thread_count; signals: void mySinal();//信号 void mySinal_param(int thread_count); public slots: }; #endif // MYTHREAD_Hmythread.cpp
#include "mythread.h" Mythread::Mythread(QObject *parent) : QThread(parent) { } void Mythread::run() { int mythread_count=0; while (!isInterruptionRequested()) { mythread_count = mythread_count + 5; emit mySinal();//发送信号 emit mySinal_param( mythread_count );//发送含参数的信号 msleep(100); } }demowidget1.h
#ifndef DEMOWIDGET1_H #define DEMOWIDGET1_H #include <QWidget> #include <mythread.h> QT_BEGIN_NAMESPACE namespace Ui { class DemoWidget1; } QT_END_NAMESPACE class DemoWidget1 : public QWidget { Q_OBJECT public: DemoWidget1(QWidget *parent = nullptr); ~DemoWidget1(); private: Ui::DemoWidget1 *ui; // 声明我们的槽函数 public slots: void on_bnt_click(); // PushButton按键响应的槽函数 void on_lineEdit_input(); // lineEdit输入响应的槽函数 void on_bnt_startThread(); void on_bnt_stopThread(); // 声明需要在线程中执行的耗时函数 void long_Time_Operate(); void long_Time_Operate(int count);//重载 public: Mythread* mythread = NULL;// 线程指针 int count = 0; }; #endif // DEMOWIDGET1_Hdemowidget1.cpp
#include "demowidget1.h" #include "ui_demowidget1.h" #include <windows.h> DemoWidget1::DemoWidget1(QWidget *parent) : QWidget(parent) , ui(new Ui::DemoWidget1) { ui->setupUi(this); int count; mythread = new Mythread; //左相机线程对象 // 绑定信号与槽函数 connect(ui->bnt_click,SIGNAL(clicked()),this,SLOT(on_bnt_click())); connect(ui->lineEdit_input,SIGNAL(editingFinished()),this,SLOT(on_lineEdit_input())); connect(ui->bnt_startThread,SIGNAL(clicked()),this,SLOT(on_bnt_startThread())); connect(mythread,SIGNAL(mySinal()),this,SLOT(long_Time_Operate())); //线程的信号与对应的槽 connect(mythread,SIGNAL(mySinal_param(int)),this,SLOT(long_Time_Operate(int)));//线程的信号与对应的槽 connect(ui->bnt_stopThread,SIGNAL(clicked()),this,SLOT(on_bnt_stopThread())); } DemoWidget1::~DemoWidget1() { delete ui; } void DemoWidget1::on_bnt_click() { ui->label_diplay->setText("Hello World!!"); QFont font; font.setPointSize(45); font.setBold(true); font.setWeight(75); ui->label_diplay->setFont(font); } void DemoWidget1::on_lineEdit_input() { QString str = ui->lineEdit_input->text(); // 读取输入字符串 ui->label_diplay->setText(str); QFont font; font.setPointSize(45); font.setBold(true); font.setWeight(75); ui->label_diplay->setFont(font); } //void DemoWidget1::on_bnt_startThread() //{ // QString str ; // QFont font; // font.setPointSize(40); // font.setBold(true); // font.setWeight(75); // ui->label_diplay2->setFont(font); // for(int i=0; i<100 ;i++) // 循环 // { // QString ii = QString("%4").arg(i); // ui->label_diplay2->setText(ii); // QThread::msleep(50);// 延时 // } //} void DemoWidget1::on_bnt_startThread() // 只负责开启线程 { if (!mythread->isRunning()) { mythread->start(); ui->label_diplay2->setText("my thread start"); } } void DemoWidget1::on_bnt_stopThread() { if(!mythread->isInterruptionRequested()) { mythread->requestInterruption(); mythread->wait(); } } void DemoWidget1::long_Time_Operate() { QString str ; QFont font; font.setPointSize(72); font.setBold(true); font.setWeight(75); ui->label_diplay2->setFont(font); ui->label_diplay2->setText("long_Time_Operate"); count++; QString ii = QString("%4").arg(count); ui->label_diplay2->setText(ii); } void DemoWidget1::long_Time_Operate(int new_count) { QString str ; QFont font; font.setPointSize(72); font.setBold(true); font.setWeight(75); ui->label->setFont(font); ui->label->setText("long_Time_Operate"); QString ii = QString("%4").arg(new_count); ui->label->setText(ii); }
参照相机SDK实现工业相机基本操作功能以及单相机标定
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。