前言
Qt连载:
1.Qt开发初步
2.Qt常用控件
3.Qt嵌入式编程
注意
新建控件可以在类中,可以在main中,也可以在新建文件中,有不同的灵活性效果。
显示控件
1.Label标签
显示文本、链接、图片、动画:
//链接
QLabel *label = new QLabel(this);
label->setText("Richard");
label->setText("<h1><a href = \"https://blog.csdn.net/weixin_44705391/article/details/113813730\">Qt基础</a></h1>");
label->setOpenExternalLinks(true); //设置用户点击链接后是否自动打开链接,true为自动打开
//图片
QLabel *label_pic = new QLabel(this);
label_pic->setPixmap(QPixmap("../richard.jpg")); //注意是相对makefile的路径
label_pic->setScaledContents(true); //设置自适应大小
//动画
QMovie *move = new QMovie("../richard.gif"); //创建动态图
QLabel *label_move = new QLabel(this);
label_move->setMovie(move);
label_move->setScaledContents(true); //设置自适应大小
move->start(); //启动动画效果
2.Process bar进度条
其他显示控件略
布局控件
layouts一类控件,属于容器控件,里面可以放其他控件,来设置界面布局。
spacers控件,类似。
按钮控件
1.push button
2.tool button
3.radio button
4.check button
5.command link button
6.button box
输入控件
1.LineEdit行编辑
新建带ui的工程,添加Input Widgets控件
右击转到槽->returnPressed();->槽函数添加代码:
qDebug()<<ui->lineEdit->text(); //获取行编辑内容,行中输入内容敲
设置显示模式
设置文本的显示模式void setEchoMode(EchoMode)
EchoMode是一个枚举类型,一共定义了四种显示模式:
QLineEdit::Normal 模式显示方式,按照输入的内容显示。
QLineEdit::NoEcho 不显示任何内容,此模式下无法看到用户的输入。
QLineEdit::Password 密码模式,输入的字符会根据平台转换为特殊字符。
QLineEdit::PasswordEchoOnEdit 编辑时显示字符否则显示字符作为密码。
ui->lineEdit->setEchoMode(QLineEdit::Password);
设置内容显示的间隔
setTextMargins函数:声明:void QLineEdit::setTextMargins(int left, int top, int right, int bottom)指定像素数
ui->lineEdit->setTextMargins(15,0,0,0); //这里的间距是以像素点为单位
设置输入提示
我们想输入一个或者几个字符,下边就会列出和我们输出的字符相匹配的字符串,QLineEdit要实现这样的功能可以使用该类的成员函数setComleter()函数来实现:void QLineEdit::setCompleter(QCompleter *c)
ui->setupUi(this);
QStringList list; //需要#include <QStringList> 字符串链表头文件
list<<"Hello"<<"How are you!"<<"hehe";
QCompleter *com = new QCompleter(list,this); //需要#include <QCompleter>
com->setCaseSensitivity(Qt::CaseInsensitive);
ui->lineEdit->setCompleter(com);
QCompleter类的setCaseSensitivity()函数可以设置是否区分大小写,它的参数是一个枚举类型:
Qt::CaseInsensitive 不区分大小写
Qt::CaseSensitive 区分大小写
如果不设置该属性,默认匹配字符串时是区分大小写的。
自定义控件
在搭建Qt窗口界面的时候,在一个项目中很多窗口,或者是窗口中的某个模块会被经常性的重复使用。一般遇到这种情况我们都会将这个窗口或者模块拿出来做成一个独立的窗口类,以备以后重复使用。
在使用Qt的ui文件搭建界面的时候,工具栏中只为我们提供了标准的窗口控件,如果我们想使用自定义控件怎么办?
例如:我们从QWidget派生出一个类SmallWidget(右击工程添加新文件),实现了一个自定窗口,来实现一个简单的功能
// smallwidget.h
class SmallWidget : public QWidget
{
Q_OBJECT
public:
explicit SmallWidget(QWidget *parent = 0);
signals:
public slots:
private:
QSpinBox* spin;
QSlider* slider;
};
// smallwidget.cpp
SmallWidget::SmallWidget(QWidget *parent) : QWidget(parent)
{
spin = new QSpinBox(this);
slider = new QSlider(Qt::Horizontal, this);
// 创建布局对象
QHBoxLayout* layout = new QHBoxLayout;
// 将控件添加到布局中
layout->addWidget(spin);
layout->addWidget(slider);
// 将布局设置到窗口中
setLayout(layout);
// 添加消息响应
connect(spin,
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
connect(slider, &QSlider::valueChanged,
spin, &QSpinBox::setValue);
}
那么这个SmallWidget可以作为独立的窗口显示,也可以作为一个控件来使用:
打开Qt的.ui文件,因为SmallWidget是派生自Qwidget类,所以需要在ui文件中先放入一个QWidget控件, 然后右击右边栏的类->widget->提升->类名称框输入smallwidget->勾选上方的头文件->完成
弹出提升窗口部件对话框
添加要提升的类的名字,然后选择 添加
添加之后,类名会显示到上边的列表框中,然后单击提升按钮,完成操作.
我们可以看到, 这个窗口对应的类从原来的QWidget变成了SmallWidget
再次运行程序,这个widget_3中就能显示出我们自定义的窗口了.
其他控件小案例
TreeWidget
cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//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 heroL1;
QStringList heroL2;
QStringList heroM1;
QStringList heroM2;
QStringList heroZ1;
QStringList heroZ2;
heroL1 << " 刚被猪" << " 前排坦克,能在吸收伤害的同时造成可观的范围输出";
heroL2 << " 船长" << " 前排坦克,能肉能输出能控场的全能英雄";
heroM1 << " 月骑" << " 中排物理输出,可以使用分裂利刃攻击多个目标";
heroM2 << " 小鱼人" << " 前排战士,擅长偷取敌人的属性来增强自身战力";
heroZ1 << " 死灵法师" << " 前排法师坦克,魔法抗性较高,拥有治疗技能";
heroZ2 << " 巫医" << " 后排辅助法师,可以使用奇特的巫术诅咒敌人与治疗队友";
//追加子项目 子项也是QTreeWidgetItem
QTreeWidgetItem * li1 =new QTreeWidgetItem(heroL1);
liItem->addChild(li1);
QTreeWidgetItem * li2 =new QTreeWidgetItem(heroL2);
liItem->addChild(li2);
QTreeWidgetItem * Min1 =new QTreeWidgetItem(heroM1);
minItem->addChild(Min1);
QTreeWidgetItem * Min2 =new QTreeWidgetItem(heroM2);
minItem->addChild(Min2);
QTreeWidgetItem * Zhi1 =new QTreeWidgetItem(heroZ1);
zhiItem->addChild(Zhi1);
QTreeWidgetItem * Zhi2 =new QTreeWidgetItem(heroZ2);
zhiItem->addChild(Zhi2);
}
Widget::~Widget()
{
delete ui;
}
TableWidget
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//QTableWidget控件使用
//告诉控件 一共有多少列
QStringList list;
list << "姓名"<< "性别"<< "年龄";
ui->tableWidget->setColumnCount(list.size());
//设置水平头
ui->tableWidget->setHorizontalHeaderLabels(list);
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
//ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
//准备数据
QStringList nameList;
nameList << "亚瑟"<< "妲己"<< "安琪拉"<< "东皇太一"<< "李白";
QList<QString> 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.at(i)));
//添加年龄
//int 转 QString number
ui->tableWidget->setItem(i,col++,new QTableWidgetItem( QString::number(i+18)));
}
//点击按钮 添加赵云
connect(ui->addBtn,&QPushButton::clicked,[=](){
//先判断有没有赵云,有不添加,没有才添加
bool isEmpty = ui->tableWidget->findItems("赵云",Qt::MatchExactly).empty();
if(isEmpty)
{
ui->tableWidget->insertRow(0);
ui->tableWidget->setItem(0,0,new QTableWidgetItem("赵云"));
ui->tableWidget->setItem(0,1,new QTableWidgetItem("男"));
ui->tableWidget->setItem(0,2,new QTableWidgetItem( QString::number(20)));
}
else
{
QMessageBox::warning(this,"警告!","赵云有了!");
}
});
//点击按钮 删除赵云
connect(ui->delBtn,&QPushButton::clicked,[=](){
bool isEmpty = ui->tableWidget->findItems("赵云",Qt::MatchExactly).empty();
if(isEmpty)
{
QMessageBox::warning(this,"警告!","赵云没有了!");
}
else
{
//先找到赵云所在的行
int row = ui->tableWidget->findItems("赵云",Qt::MatchExactly).first()->row();
//找到行数 删除掉
ui->tableWidget->removeRow(row);
}
});
}
Widget::~Widget()
{
delete ui;
}
Other控件混合
在这里插入图片描述
#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置默认选中第0项
ui->stackedWidget->setCurrentIndex(0);
//stackWidget
connect(ui->btnScroll,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
connect(ui->btnTab,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
connect(ui->btnToolBox,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
//下拉框使用
ui->comboBox->addItem("奔驰");
ui->comboBox->addItem("宝马");
ui->comboBox->addItem("拖拉机");
//点击拖拉机按钮
connect(ui->btnChoose,&QPushButton::clicked,[=](){
ui->comboBox->setCurrentText("拖拉机");
});
//利用QLabel显示图片
ui->img->setPixmap(QPixmap(":/Image/Luffy.png"));
//利用QLabel显示gif图片
QMovie * movie = new QMovie(":/Image/mario.gif");
ui->movie->setMovie(movie);
//播放gif
movie->start();
}
Widget::~Widget()
{
delete ui;
}
参考文章:
设置显示模式:https://blog.csdn.net/qq_43630810/article/details/106461663(侵删)
自定义控件:https://blog.csdn.net/weixin_45525272/article/details/106859722(侵删)