勇哥的VC++应用框架学习之QT(4) 常用控件:表格、树型、列表、显示图片等

基本上C#中我们常见的控件都包含了。


  • QListWidget

    这个相当于C#中的listBox控件

  • QTreeWidget

    这个相当于C#中的listView控件

  • QTableWidget

    这个是C#中的dataGridView控件

  • QStackedWidget

    这个就是没有标签显示的TabWidget控件

  • QLabel

    在QT中,这个控件除了显示文字,还可以显示图片,电影,gif

  • QTabWidget

    这个相当于C#中的tabControl,分页显示用。

  • QPushButton

    按钮


演示程序的效果。

image.png

image.png

注意上图中红衣女是张gif动图。


UI界面如下:

image.png

image.png

源代码:

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

using namespace cv;
using namespace std;
QtForOpencv::QtForOpencv(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	 
	//////////////listWidget//////////////////
	QStringList list;
	list << "春林花多媚" << "春鸟意多哀" << "春风复多情" << "吹我罗裳开";
	ui.listWidget->addItems(list);
	
	//////////////treeWidget//////////////////

	//添加头
	ui.treeWidget->setHeaderLabels(QStringList()<< "英雄姓名" << "英雄介绍");
	//添加项目
	QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList() << "力量");
	QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList() << "敏捷");
	QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList() << "智力");
	//添加顶层项目
	ui.treeWidget->addTopLevelItem(liItem);
	ui.treeWidget->addTopLevelItem(minItem);
	ui.treeWidget->addTopLevelItem(zhiItem);

	QStringList L1, L2, M1, M2, Z1, Z2;
	L1 << "霍尔" << "属性1";
	L2 << "船长" << "属性2";
	M1 << "小美" << "属性3";
	M2 << "太长" << "属性4";
	Z1 << "林长" << "属性5";
	Z2 << "私无七" << "属性6";

	//追加子项目,子项也是QTreeWidgetItem
	QTreeWidgetItem * li1 = new QTreeWidgetItem(L1);
	liItem->addChild(li1);
	QTreeWidgetItem * li2 = new QTreeWidgetItem(L2);
	liItem->addChild(li2);
	QTreeWidgetItem * Min1 = new QTreeWidgetItem(M1);
	minItem->addChild(Min1);
	QTreeWidgetItem * Min2 = new QTreeWidgetItem(M2);
	minItem->addChild(Min2);
	QTreeWidgetItem * Zhi1 = new QTreeWidgetItem(Z1);
	zhiItem->addChild(Zhi1);
	QTreeWidgetItem * Zhi2 = new QTreeWidgetItem(Z2);
	zhiItem->addChild(Zhi2);

	//////////////QTableWidget//////////////////
	QStringList list1;
	list1 << "姓名" << "性别" << "年龄";
	ui.tableWidget->setColumnCount(list1.size());
	//设置水平头
	ui.tableWidget->setHorizontalHeaderLabels(list1);
	//设置行数
	ui.tableWidget->setRowCount(5);
	//设置正文
	QStringList nameList;
	nameList << "太美" << "李白" << "张飞" << "刘备" << "关去长";
	QStringList sexList;
	sexList << "女" << "男" << "妇" << "男" << "男";
	for(int i = 0; i < 5; i++){
		int col = 0;
		ui.tableWidget->setItem(i, col++, new QTableWidgetItem(nameList[i]));
		ui.tableWidget->setItem(i, col++, new QTableWidgetItem(sexList[i]));
		ui.tableWidget->setItem(i, col++, new QTableWidgetItem(QString::number(i+18)));
	}
	const QString m = "勇哥";
	connect(ui.btnAddyong, &QPushButton::clicked, [=](){
		//先判断有无,再添加
		bool isEmpty = ui.tableWidget->findItems(m, Qt::MatchExactly).empty();
		qDebug() << "insert";
		if (isEmpty){
			ui.tableWidget->insertRow(0);
			ui.tableWidget->setItem(0, 0, new QTableWidgetItem(m));
			ui.tableWidget->setItem(0, 1, new QTableWidgetItem("男"));
			ui.tableWidget->setItem(0, 2, new QTableWidgetItem(33));
		}
		else{
			QMessageBox::warning(this, "警告", m+"已经存在!");
		}
	});

	connect(ui.btnDelyong, &QPushButton::clicked, [=](){
		bool isEmpty = ui.tableWidget->findItems(m, Qt::MatchExactly).empty();
		qDebug() << "del";
		if (isEmpty){
			QMessageBox::warning(this, "警告", m + "不存在!");
		}
		else
		{
			//找到勇哥所在行,再删除
			int row = ui.tableWidget->findItems(m, Qt::MatchExactly).first()->row();
			ui.tableWidget->removeRow(row);
		}
	});

	//////////////stackWidget//////////////////
	//默认选中第0项
	ui.stackedWidget->setCurrentIndex(0);
	//按钮换页
	connect(ui.btnImg1, &QPushButton::clicked, [=](){
		ui.stackedWidget->setCurrentIndex(0);
		ui.btnDisplayImg1->setStyleSheet("border-image:url(:/QtForOpencv/E:/2.png);");
	});
	connect(ui.btnImg2, &QPushButton::clicked, [=](){
		ui.stackedWidget->setCurrentIndex(1);
		ui.btnDisplayImg2->setStyleSheet("border-image:url(:/QtForOpencv/E:/3.png);");
	});
	connect(ui.btnImg3, &QPushButton::clicked, [=](){
		ui.stackedWidget->setCurrentIndex(2);
		ui.btnDisplayImg3->setStyleSheet("border-image:url(:/QtForOpencv/E:/5.png);");
	});

	//////////////QLable//////////////////
	ui.label->setPixmap(QPixmap(":/QtForOpencv/E:/5.png"));
	QMovie * movie = new QMovie(":/QtForOpencv/E:/12.gif");
	ui.labImg->setMovie(movie);
	movie->start();

	waitKey(0);

}


代码说明:

(1)下面这种用法是 Lambda表达式,这是新版本C++的知识点。

C#在这方面有优越感。这里用来做信号槽非常方便。

connect(ui.btnAddyong, &QPushButton::clicked, [=](){});

(2)数据结构对象 QStringList是字符串列表,它的基类是QList < QString>

这个基类可以和C#中的List<string>有得一比较。这里专门整个QStringList类出来是因为丰富了一些字符串处理的方法和提高字符串处理的效率。

有一篇贴子可以参考一下:QStringList 的学习笔记  


(3)注意下面的代码中,使用的css一样的语法添加了样式。这里让按钮显示了背景图。

这一点很有趣。

ui.btnDisplayImg1->setStyleSheet("border-image:url(:/QtForOpencv/E:/2.png);");

(4)QMessageBox类还有一些方便快速书写的静态函数。

真是贴心啊!

QMessageBox::warning(this, "警告", m + "不存在!");


学到这里,突然有点觉得QT的许多封装类越来越像C#的感觉了。勇哥有点点喜欢上Qt了。


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

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


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

发表评论:

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

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 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