勇哥的VC++应用框架学习之QT(3) vs+qt下的信号槽、QCommboBox控件、多窗口调用

这篇勇哥要熟悉一下QT的信号槽怎么样快速实现。

想要快速实现就不能完全敲代码,可以借助于QT的UI编辑器来完成。


另外通过常见的QCommboBox控件来熟悉控件的操作。还有多个窗口是如何调用。


image.png


代码:


QtForOpencv.h

#pragma once
#pragma execution_character_set("utf-8")
#include <QtWidgets/QWidget>
#include "ui_QtForOpencv.h"
#include <QLabel>
#include "QtOpenTxt.h"

class QtForOpencv : public QWidget
{
	Q_OBJECT

public:
	QtForOpencv(QWidget *parent = Q_NULLPTR);

private:
	Ui::QtForOpencvClass ui;
	QtOpenTxt * openfile;

private slots:
	void slotInitItems();	//初始化下拉列表框
	void slotClearItems();	//清除列表框所有项
	void slotInsertItem();	//插入新项
	void slotDeleteItem();	//插队某项
	void slotDisplayItems();	//在文本框中显示所有信息,包含附加数据

	void slotCurrentIndexChanged(int val);
	void slotCurrentIndexChanged(const QString &val);
	
	void slotOpenText();
	void slotOpentxtNewWin();

public:
	QLabel* imgLabel;
};



QtForOpencv.cpp

#include "QtForOpencv.h"
#include <opencv2\opencv.hpp>
#include <opencv2\core.hpp>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\imgproc.hpp>
#include <qdebug.h>
#include <qfiledialog.h>
#include <qmessagebox.h>

using namespace cv;
using namespace std;
QtForOpencv::QtForOpencv(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	//这个个信号槽勇哥改成在界面上去操作了。所以这里没有必须要再写了。
	//connect(ui.btnInit, SIGNAL(clicked()), this, SLOT(slotInitItems()));
	//其它的信号槽都用代码写出来。
	connect(ui.btnClearItem, SIGNAL(clicked()), this, SLOT(slotClearItems()));
	connect(ui.btnInsert, SIGNAL(clicked()), this, SLOT(slotInsertItem()));
	connect(ui.btnDel, SIGNAL(clicked()), this, SLOT(slotDeleteItem()));
	connect(ui.btnDisplayInfo, SIGNAL(clicked()), this, SLOT(slotDisplayItems()));
	connect(ui.cbxList, SIGNAL(currentIndexChanged(int)), SLOT(slotCurrentIndexChanged(int)));
	connect(ui.cbxList, SIGNAL(currentIndexChanged(const Qstring &)), 
		SLOT(slotCurrentIndexChanged(const QString &)));

	waitKey(0);
	
}

void QtForOpencv::slotInitItems()
{
	QMap<QString, int> map;
	
	map.insert("张三", 81);
	map.insert("李四", 88);
	map.insert("王五", 73);
	map.insert("赵六", 91);
	map.insert("李七", 90);
	qDebug() << "slotInitItems";
	QIcon icon(":/QtForOpencv/E:/程序开发用图标/程序开发用图标/编程1000多个图标/Icon/007A.ICO");
	ui.cbxList->clear();
	foreach(const QString name,map.keys())
	{
		if (ui.chkIsIcon->isChecked())
			ui.cbxList->addItem(icon, name, map.value(name));
		else
			ui.cbxList->addItem(name, map.value(name));
	}
}

void QtForOpencv::slotClearItems()	//清除列表框所有项
{
	ui.cbxList->clear();
}

void QtForOpencv::slotInsertItem()	//插入新项
{
	int pos = ui.spinBoxInserPos->value();
	QIcon icon(":/QtForOpencv/E:/程序开发用图标/程序开发用图标/编程1000多个图标/Icon/014A.ICO");
	if (ui.chkIsIcon->isChecked())
		ui.cbxList->insertItem(pos, icon, "new item", 88);
	else
		ui.cbxList->insertItem(pos, "new item", 88);
}

void QtForOpencv::slotDeleteItem()	//插队某项
{
	int pos = ui.spinBoxDeletePos->value();
	ui.cbxList->removeItem(pos);
}

void QtForOpencv::slotDisplayItems()	//在文本框中显示所有信息,包含附加数据
{
	for (int i = 0; i < ui.cbxList->count(); i++){
		ui.txtMsg->appendPlainText(
			QString("index:%1 | text:%2 | score:%3")
			.arg(i)
			.arg(ui.cbxList->itemText(i))
			.arg(ui.cbxList->itemData(i).toString())
			);
	}
	ui.txtMsg->appendPlainText("============================");
}

void QtForOpencv::slotCurrentIndexChanged(int val){
	ui.txtMsg->appendPlainText(QString("current index changed: index=%1").arg(val));
}

void QtForOpencv::slotCurrentIndexChanged(const QString &val){
	ui.txtMsg->appendPlainText(QString("current index changed: text=%1").arg(val));
}

void QtForOpencv::slotOpentxtNewWin()
{
	openfile = new QtOpenTxt;
	openfile->show();//openfile窗口显示
	//this->hide();//本窗口隐藏
	
}

void QtForOpencv::slotOpenText()
{
	qDebug() << "slotOpenText";
	QString filename;
	//限定只能打开*.txt文件
	filename = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("*.txt"));
	if (!filename.isNull()) {
		//filename是选择的文件名
		QFile file(filename);
		//如果读文件错误,要输出提示信息
		if (!file.open(QFile::ReadOnly | QFile::Text)) {
			QMessageBox::warning(this, tr("Error"), tr("read file error:&1").arg(file.errorString()));
			return;
		}
		//文件流
		QTextStream in(&file);
		//QApplication::setOverrideCursor(Qt::WaitCursor);
		//将读入的文件信息显示到textEdit中
		
		ui.txtMsg->appendPlainText(in.readAll());
		file.close();
	}
	else {
		qDebug() << "取消";
	}

}

QtOpenTxt.h

#pragma once

#include <QWidget>
#include "ui_QtOpenTxt.h"

class QtOpenTxt : public QWidget
{
	Q_OBJECT

private slots:
	void slotOpentxt();
	void slotWinQuit();

public:
	QtOpenTxt(QWidget *parent = Q_NULLPTR);
	~QtOpenTxt();



private:
	Ui::QtOpenTxt ui;
};


QtOpenTxt.cpp

#include "QtOpenTxt.h"
#include <qtextstream.h>
#include <qfiledialog.h>
#include <qfile.h>
#include <qmessagebox.h>
#include "QtForOpencv.h"
#include <qdebug.h>

QtOpenTxt::QtOpenTxt(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
}

QtOpenTxt::~QtOpenTxt()
{
}

void QtOpenTxt::slotOpentxt(){
	QString filename;
	//限定只能打开*.txt文件
	filename = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("*.txt"));
	if (!filename.isNull()) {
		//filename是选择的文件名
		QFile file(filename);
		//如果读文件错误,要输出提示信息
		if (!file.open(QFile::ReadOnly | QFile::Text)) {
			QMessageBox::warning(this, tr("Error"), tr("read file error:&1").arg(file.errorString()));
			return;
		}
		//文件流
		QTextStream in(&file);
		//QApplication::setOverrideCursor(Qt::WaitCursor);
		//将读入的文件信息显示到textEdit中
		ui.txtMsg->setText(in.readAll());
		file.close();
	}
	else {
		qDebug() << "取消";
	}
}
void QtOpenTxt :: slotWinQuit(){
	/*
	*同样这里暂时先给出一段弹出提示返回成功的弹窗代码
	*稍后on_backbutton_clicked()函数需要移动到别处,此处就不需要了
	*/
	QMessageBox message(QMessageBox::NoIcon, "Tip", "Back successfully ");
	message.exec();

	//QtForOpencv *program = new QtForOpencv;
	//program->show();//program窗口显示
	//this->hide();//本窗口隐藏
	//this->close();
	this->close();

}


几点说明:

(1)UI设计器上做信号槽的方法,就是用红框处的工具。

image.png

(2)在界面上访问控件的方法

首选你在UI设计器中自己把控件命名。

image.png

然后在代码里,就是以ui. 控件的名字,来访问控件了。

image.png

然而,你是不是即使这样做了, ui.btnClearItem 仍然不存呢?

这是因为你UI编辑器完成后,你得在vs中把这个UI编译一下。image.png

这时候你会发现vs提示文件被更新了,出现这个就对了,因为Ui那边的更新被发现了。

image.png

然后就发现ui.btnClearItem这个可以出现在语法补全的列表中了。

如果你发现即重新编译ui,也不行,试试下面这个按钮,显示全部文件,然后再编译ui, 应该就可以了。

image.png

当然,如果还是不行,终极的办法就是重新打开工程,再编译肯定就可以了。


(3) QString类的arg方法


详细见另一篇贴子:

QT学习之QString的arg方法  


其它的就没有啥子好说了。总得来讲,QT这么做确实让UI控件易于使用了。有了几分C#做界面的感觉了。

接下来就要熟悉一下工业设备软件中常用的一些控件,在QT中对应的控件了。


--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864