Qt:第三章:常用控件介绍
一、窗口控件
1、窗口创建
窗口分为三种:普通窗口、无边框窗口以及顶层窗口(顶层窗口永远在最上面)
//普通窗口
QWidget *widget = new QWidget(nullptr,Qt::Tool|Qt::WindowCloseButtonHint|Qt::WindowMaximizeButtonHint);
widget->setWindowTitle(QStringLiteral("widget窗口"));
widget->show();
//无边框
QWidget *widget1 = new QWidget(nullptr, Qt::FramelessWindowHint);
widget1->show();
//作为顶层窗口出现
QWidget *widget2 = new QWidget(nullptr,Qt::Dialog| Qt::WindowStaysOnTopHint);
widget2->setWindowTitle("top widget");
widget2->show();
2、对话框
1、模态对话框和非模态对话框
模态对话框:就是我们没有关闭它之前,不能再与同一个应用程序中的其他窗口进行交互(操作),例如vs中的新建项目窗口,若不关闭,无法进行编写代码的操作。要想使一个窗口为模态窗口,需要调用它的exec()方法显示窗口。
非模态对话框:关闭该对话框之前,还可以与应用程序中的其他窗口进行交互(操作),例如记事本中的查找窗口要想使一个窗口为非模块窗口的话,需要使用new操作符在堆上创建窗口对象,使用show()方法进行显示
//模态对话框
void Dialog04::on_modalButton_clicked()
{
QDialog dlg(this);
dlg.resize(200, 200);
dlg.exec();
}
//非模态对话框
void Dialog04::on_noModalButton_clicked()
{
QDialog dlg1(this);
dlg1.resize(200, 200);
dlg1.show();
}
2、消息对话框
MessageBox:有信息提示框、警告提示框、错误提示框、问题提示框、关于提示框
//信息提示框
QMessageBox::information(nullptr, QStringLiteral("提示信息"), QStringLiteral("这是信息提示窗口"), QMessageBox::Yes | QMessageBox::No);
//警告提示框
QMessageBox::warning(nullptr, QStringLiteral("警告信息"), QStringLiteral("程序警告信息"));
//错误提示框
QMessageBox::critical(nullptr, QStringLiteral("错误信息"), QStringLiteral("程序发生致命错误"));
//问题提示框
QMessageBox::question(nullptr, QStringLiteral("问题信息"), QStringLiteral("你是否关闭问题窗口"),QMessageBox::Yes | QMessageBox::No);
//关于提示框
QMessageBox::about(nullptr, QStringLiteral("关于"), QStringLiteral("关于应用程序"));//自定义
QMessageBox::aboutQt(nullptr);//显示Qt文档
显示图标分别为:
3、文件对话框
QFileDialog :用于文件的读写
3.1、读文件
方式一:普通方法进行文件读取
//参数1:父对象 参数2:窗口标题 参数3:指定默认打开路径 参数4:过滤器(过滤文件类型)
QString strFileName = QFileDialog::getOpenFileName(this, QStringLiteral("打开文件对话框"), "D:\\",QStringLiteral("文本文件(*txt);;源文件(*cpp)"));
//创建读写文件对象
QFile file(strFileName);
//以指定方式打开文件
file.open(QIODevice::ReadOnly | QIODevice::Text);
//读取文件所有内容
QByteArray content = file.readAll();
//信息框展示文件内容
QMessageBox::information(nullptr, QStringLiteral("读取文件"), QString(content));
//关闭
file.close();
方式二:使用QTextStream流方法
//参数1:父对象 参数2:窗口标题 参数3:指定默认打开路径 参数4:过滤器(过滤文件类型)
QString strFileName = QFileDialog::getOpenFileName(this, QStringLiteral("打开文件对话框"), "D:\\",QStringLiteral("文本文件(*txt);;源文件(*cpp)"));
//创建读写文件对象
QTextStream stream(&file);
//以指定方式打开文件
file.open(QIODevice::ReadOnly | QIODevice::Text);
//读取文件内容
stream.read(1);//读取一个字符、
//stream.seek(0);//移动光标到最开始
//stream.readLine();//读取一行字符
//stream.readAll();//读取全部字符
//使用流将读取数据写入string
QString string;
stream >> string;
//信息框展示文件内容
QMessageBox::information(nullptr, QStringLiteral("读取文件"), string);
//关闭
file.close();
3.2、写文件
//选择文件,用strFileName接收文件路径
QString strFileName = QFileDialog::getSaveFileName(this, QStringLiteral("保存文件对话框"), "D:\\",
QStringLiteral("文本文件(*.txt);;源文件(*.cpp)"));
if (!strFileName.isEmpty()) {
QFile file(strFileName);
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream << "123456";//写入文件
file.close();//关闭文件
}
else {
//文件路径为空时的处理
//qDebug() << "无法打开文件:" << strFileName;
}
}
4、颜色对话框
QClolrDialog:使用Qt内置的颜色选择器
//参数1:颜色窗口打开时默认选择的颜色,参数2:父对象,参数3:窗口标题 参数4:透明度调整
//方式1
QColor color = QColorDialog::getColor(Qt::red, this, QStringLiteral("选择颜色"),QColorDialog::ShowAlphaChannel);
qDebug() << color;
//打开颜色对话框方式2
QColorDialog dialog(Qt::green, this);//创建颜色对话框
dialog.exec();//显示颜色对话框
QColor color = dialog.currentColor();//获取用户当前选择的颜色
qDebug() << color;
5、进度对话框
QProgressDialog:慢动作进度反馈
Qt有提供写好的进度条:progressBar
//进度对话框 参数1:进度条上的文本信息 参数二:取消按钮的文本 参数3:起始值 参数4:结束值 参数5:父对象
QProgressDialog dialog(QStringLiteral("文件复制进度"), QStringLiteral("取消"), 0, 1000, this);
//调整窗口尺寸
dialog.resize(300, 40);
//以下两句代码用于设置窗口为模态窗口,级别比exec()要低
dialog.setWindowModality(Qt::WindowModal);
dialog.show();
//进度条的进度变化
for (int i=0;i<= 1000;i++)
{
Sleep(5);
//设置进度条上的文本变化值
dialog.setValue(i);
}
3、QMainWindow主窗口
1、菜单栏
菜单栏:QMenuBar,菜单栏最多只能有一个,可以没有
菜单:QMenu:添加到菜单栏上的部件
菜单项:QAction:添加到菜单上的部件
//创建菜单栏
QMenuBar * bar = menuBar();
//创建菜单
QMenu *fileMenu = new QMenu(QStringLiteral("文件"));
//把文件和编辑菜单添加到编辑栏上
bar->addMenu(fileMenu);//方式一:先创建再添加
bar->addMenu(QStringLiteral("编辑"));//直接添加
//创建菜单项
QAction *newAction = new QAction(QStringLiteral("新建"));
//将菜单项添加到菜单上
fileMenu->addAction(newAction);
//添加一条分割线
fileMenu->addSeparator();
fileMenu->addAction(QStringLiteral("打开"));
//将菜单栏添加到窗口menu
this->setMenuBar(bar);
//绑定操作信号
connect(newAction, &QAction::triggered, this, &MainWindow05::myNewActionSlots);
2、工具栏
QToolBa:可以设置是否浮动、是否移动及添加带图标按钮等
//创建
QToolBar *toolBar = new QToolBar(this);
//添加到此窗口最上面
this->addToolBar(Qt::TopToolBarArea, toolBar);
//设置工具栏是否可浮动 false--不可浮动
toolBar->setFloatable(true);
//设置工具栏是否可移动
toolBar->setMovable(true);
//添加按钮
QPushButton *btn = new QPushButton(QStringLiteral("新建"),this);
toolBar->addWidget(btn);
//添加两个action到工具栏上
toolBar->addAction(findAction);
toolBar->addAction(newAction);
//添加分隔符
toolBar->addSeparator();
//工具栏ToolBar上添加QToolButton按钮
//新建toolButton按钮
QToolButton *toolButton = new QToolButton();
toolButton->setIcon(QIcon(":/MainWindow05/image/56.png"));//设置图标地址
toolButton->setText(QStringLiteral("帮助"));//设置图标名称
toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//设置图标格式:图标在文字上方
//添加到菜单栏
toolBar->addWidget(toolButton);
3、状态栏
//创建空的状态栏
QStatusBar *statusBar = this->statusBar();
///将标签控件添加到状态栏
QLabel *label = new QLabel(QStringLiteral("状态信息1"));
statusBar->addWidget(label);
//将按钮控件添加到状态栏
QPushButton *btn1 = new QPushButton(QStringLiteral("状态栏按钮"), this);
statusBar->addWidget(btn1);
//将label2添加到状态栏最右侧
QLabel *label2 = new QLabel(QStringLiteral("状态信息2"));
statusBar->addPermanentWidget(label2);
4、可停靠区域控间
QDockWidget *dockWidget = new QDockWidget(QStringLiteral("停靠窗口1"));
//QMainWindow中addDockWidget()添加停靠窗口到指定位置
this->addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
二、基础控件
1、按钮类控件
QPushButton(普通按钮):可以添加图标,还可以添加菜单及菜单项
QToolButton(工具按钮):主要用于QMainWindow的QToolBar中,可以设置图片和文本的相对位置,也可以只显示图标或文本
QRadioButton(单选按钮):主要用于从一组按钮中选择其中的某一个
QCheckBox(复选框):可以同时选择多项
QButtonGroup(按钮组):当有一组按钮可以共用一个槽函数时,可以再该槽函数中左判断逻辑,那么可以使用按钮组控件管理一组按钮。QPushButton、QToolButton、QRadioButton、QCheckBox都可以放到按钮组中管理
常用方法:
addButton()
button()
setExclusive()
buttonClicked()信号
ui.closeButton->setIcon(QIcon(":/ButtonsWidget06/image/1.png"));
//新建菜单
QMenu * menu = new QMenu(this);
//添加菜单项,(图标、文本、同时指定QAction的triggered信号对应的槽函数)
menu->addAction(QIcon(":/ButtonsWidget06/image/2.png"), QStringLiteral("关闭文件"), this, SLOT(closeFileSlot()));
ui.closeButton->setMenu(menu);
//设置两个单选按钮都不选中
//Checkable和Checked需要同时使用
ui.femaleButton->setCheckable(false);
ui.femaleButton->setChecked(false);
//禁止按钮,置灰,无法操作
ui.femaleButton->setDisabled(false);
//复选框开启三态
//ui.paintCheckBox->setTristate(true);
//connect(ui.paintCheckBox,&QCheckBox::stateChanged,this,&ButtonsWidget06::checkBoxStateChangeSlot);
//创建按钮组对象
m_pButtonGroup = new QButtonGroup(this);
//同一组中内容只能选一个
m_pButtonGroup->setExclusive(true);
m_pButtonGroup->addButton(ui.paintCheckBox, 0);
m_pButtonGroup->addButton(ui.writeCheckBox, 1);
m_pButtonGroup->addButton(ui.ballCheckBox, 2);
//connect绑定有重载时,推荐使用Qt写法
//buttonGroupClickedSlot:根据传入id显示对应提示框
connect(m_pButtonGroup,SIGNAL(buttonClicked(int)),this,SLOT(buttonGroupClickedSlot(int));
2、输入类控件
1、组合框
1、下拉列表框
提供一个下拉列表供用户选择,也可以直接作为一个QLineEdit进行输入。QComoBox除了显示可见的下拉列表外,还可以每个项关联一个QVariant类型的变量,用于存储用户数据
QComoBox的常用方法:
addTtem()
addTtems()
添加到下拉列表中的项都有一个下标,currentIndex()获取当前选中项的下标
currentText() 获取当前选中项的文本
itemText(int index) 返回指定项的文本
count()返回下拉框中的总项数
方法一:单个添加
ui.comboBox->addItem(QStringLiteral("陕西省"));
ui.comboBox->addItem(QStringLiteral("山西省"));
ui.comboBox->addItem(QStringLiteral("河南省"));
//清空下拉框中的列表项
ui.comboBox->clear();
方法二:批量添加
QStringList strProvince;
strProvince << QStringLiteral("新疆自治区") << QStringLiteral("宁夏自治区") << QStringLiteral("壮族自治区");
ui.comboBox->addItems(strProvince);
ui.comboBox->clear();
方法三:添加带图标项
QIcon iconl(":/ButtonsWidget06/image/1.png");
QIcon icon2;
icon2.addFile(":/ButtonsWidget06/image/2.png");
ui.comboBox->addItem(iconl, QStringLiteral("新疆自治区"));
ui.comboBox->addItem(icon2, QStringLiteral("宁夏自治区"));
方法四:添加具有用户数据的数据项
QMap<QString, int> cityZoneMap;
cityZoneMap.insert(QStringLiteral("北京市"), 100);
cityZoneMap.insert(QStringLiteral("天津市"), 200);
cityZoneMap.insert(QStringLiteral("上海市"), 300);
cityZoneMap.insert(QStringLiteral("重庆市"), 400);
for each(const QString &key in cityZoneMap.keys()) {
ui.comboBox->addItem(key, cityZoneMap.value(key));
}
//指定项设置图标
ui.comboBox->setItemIcon(4, iconl);
2、字体下拉框
fontComboBox:Qt uI 界面内下拉框,里面包含各种字体
QFontComboBox::AllFonts 显示所有字体
QFontComboBox::ScalableFonts 显示可缩放字体d
QFontComboBox::NonScalableFonts 显示不可缩放字体
QFontComboBox::MonospacedFonts 显示等宽字体
QFontComboBox::ProportionalFonts 显示比例字体
ui.fontComboBox->setFontFilters(QFontComboBox::ScalableFonts);
//进行字体设置:下拉框字体选择后
void ButtonsWidget06::on_fontComboBox_currentFontChanged(const QFont & font)
{
ui.fontLabel->setFont(font);
}
2、单行文本编辑框
QLineEdit(行编辑器),是一个单行的文本编辑器,允许用户输入和编辑单行纯文本内容,而且它提供了复制、粘贴、撤销、剪切等功能。
1、显示模式:
Normal 正常模式
NoEcho 不显示模式
Password 密码模式
PasswordEchoOnEdit 输入时正常显示,失去输入焦点时显示为密码模式
2、焦点策略
Nofocus 控件不接受焦点
TabFocus 控件通过Tab按键接收焦点
ClickFocus 控件通过单击接收焦点
StrongFocus 控件通过Tab键和单击接收焦点
WheelFocus 控件通过鼠标滚轴
ui.verifyLineEdit->setEchoMode(QLineEdit::Normal); //设置显示模式
ui.verifyLineEdit->setFocusPolicy(Qt::StrongFocus); //设置焦点策略
ui.verifyLineEdit->setMaxLength(10); //设置最大输入长度
ui.verifyLineEdit->setPlaceholderText(QStringLiteral("请输入验证码"));//静态提示信息
//QLineEdit输入内容的限制
QIntValidator *pValid = new QIntValidator(100, 999, this);//创建整型效验器对象,参数1和参数2指定检查整数的范围
ui.verifyLineEdit->setValidator(pValid);
1、对输入的内容进行限制
正则表达式:
是一种文本模式,包含普通字符和特殊字符,它使用单个字符串来描述、匹配一系列满足某个语法规则的字符串,通常用来检索替换那些符合某个规则的文本。
正则表达式由表达式、量词和断言组成。最简单的一个表达式就是一个字符,例如x和5[ABC]可以匹配一个A或一个B或一个C,也可以简写成[A-C]
量词:一个量词指定了必须要匹配的表达式出现的次数,例如x{1,1}表示只能匹配一个x,前面的1表示最少包含一个x,后面的1表示最多包含1个x
断言:如果想匹配整个字符串,需要使用断言^和$,^表示从字符串的开始匹配,$表示一直匹配到末尾
例如:写一个正则表达式匹配到0-99之间的整数,靠头和结尾都是数字 ^[0-9]{1,2}$
[]表示范围(闭区间)
{}表示量词的最少和最多
()表示从几项里面选择一项,多项间用 | 分割表格1:正则表达式中的字符
一般可以使用一些特殊的符号表示常见的字符和常量
c字符本身 \c表示字符(a-z A-Z) \d表示数字
//创建正则表达式
QRegularExpression regl("[0-9.-]+");
//创建正则表达式验证器对象
QRegularExpressionValidator *pValidator = new QRegularExpressionValidator(this);
//把验证器对象指定正则表达式
pValidator->setRegularExpression(regl);
//验证器对象设置给LineEdit控件
ui.verifyLineEdit->setValidator(pValidator);
2、 输入内容的对其方式
ui.passwordLineEdit->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//水平垂直方向都居中
3、头部或尾部添加图标
QAction * userNameAction = new QAction(ui.userNameLineEdit);
userNameAction->setIcon(icon2);//icon2地址
ui.userNameLineEdit->addAction(userNameAction, QLineEdit::TrailingPosition);//tail
4、自动补全
//自动补全内容
QStringList strList;
strList << "Qt" << "Qt Assistant" << "Qt designer";
//QCompleter:自动补全输入类
QCompleter *com = new QCompleter(strList, this);
//设置补全器大小写不敏感
com->setCaseSensitivity(Qt::CaseInsensitive);
//放入控件
ui.userNameLineEdit->setCompleter(com);
5、常用信号
1、editingFinished 当单行文本编辑器失去焦点时发出该信号
2、textChanged 当行文本编辑框中为文本发生变化时,发出该信号,它与textEdited的区别是,通过代码(setText())改变文本时也会发出该信号
3、textEdited当文本编辑器被编辑时发出该信号,通过代码(setText())编辑文本时不会发出该信号
3、文本块编辑器
QTextEdit:可以输入多行文本内容,可以显示图像、列表和表格等文本内容
常用方法:
1、设置文本 setPlainText() 设置文本前会将之前的文本内容清空
2、追加设置文本 insertPlainText()之前文本会保留
3、获取文本内容 toPlainText()
4、当文本内容较多时,可以自动出现水平或垂直滚动条
5、改变文本块控间的背景色,还可以添加背景图片
QString strPath = "D:\\cccccc\\QtApp\\ButtonsWidget06\\image\\1.png";
//获取TextEdit的调色板(可以改变控件的背景色或设置图片)
QPalette pal = ui.textEdit->palette();
//设置调色板画刷
//创建Qpixmap对象,调整Qpixmap的大小
pal.setBrush(QPalette::Base, QPixmap(strPath).scaled(ui.textEdit->size()));
ui.textEdit->setAutoFillBackground(true);//允许用户设置背景
//将调色板设置给TextEdit
ui.textEdit->setPalette(pal);
//设置文本
void ButtonsWidget06::on_appendButton_clicked()
{
//setPlainText() 每次设置,之前文本都会清空
//insertPlainText() 尾部追加
ui.textEdit->insertPlainText(QStringLiteral("红红火火恍恍惚惚哈哈哈哈哈哈哈哈哈"));
}
//获取文本
void ButtonsWidget06::on_getButton_clicked()
{
QString strText = ui.textEdit->toPlainText();
QMessageBox::information(nullptr, "text", strText);
}
void ButtonsWidget06::on_textEdit_textChanged()
{
//移动光标:每次插入文本后,自动将光标移动到末尾
ui.textEdit->moveCursor(QTextCursor::End);
}
4、日期时间编辑器控件
QDateEdit、QTimeEdit、QDateTimeEdit
1、日期时间对象和字符类型的转换
2、信号:dateChanged(const QDate &date)、 dateTimeChanged(const QDateTime &datetime) 、timeChanged(const QTime &time)当日期时间发生改变时发射该信号
editingFinished 当控件失去焦点时发射信息
//设置时间
void ButtonsWidget06::on_timeButton_clicked()
{
QString timeStr = ui.timeLineEdit->text();
//去除字符串两边空格
timeStr.trimmed();
//字符串转为时间格式,赋值给timeEdit
ui.timeEdit->setTime(QTime::fromString(timeStr, "HH:mm:ss"));
}
//设置日期
void ButtonsWidget06::on_dateButton_clicked()
{
QString dateStr = ui.dateLineEdit->text();
//去除字符串两边空格
dateStr.trimmed();
//字符串转为时间格式,赋值给timeEdit
ui.dateEdit->setDate(QDate::fromString(dateStr, "yyyy/MM/dd"));
}
//设置时间日期
void ButtonsWidget06::on_dateTimeButton_clicked()
{
QString dateTimeStr = ui.dateTimeLineEdit->text();
//去除字符串两边空格
dateTimeStr.trimmed();
//字符串转为时间格式,赋值给timeEdit
ui.dateTimeEdit->setDateTime(QDateTime::fromString(dateTimeStr, "yyyy/MM/dd HH:mm:ss"));
}
//获取时间日期
void ButtonsWidget06::on_getDateTimeButton_clicked()
{
//获取系统当前日期和时间
QDateTime dateTime = QDateTime::currentDateTime();
//设置时间
//将时间对象设置到timeEdit上面
ui.timeEdit->setTime(dateTime.time());
//将时间对象转为字符串设置到QLineEdit上面
ui.timeLineEdit->setText(dateTime.time().toString("HH:mm:ss"));
//设置日期
ui.dateEdit->setDate(dateTime.date());
ui.dateLineEdit->setText(dateTime.date().toString("yyyy/MM/dd"));
//设置日期时间
ui.dateTimeEdit->setDateTime(dateTime);
ui.dateTimeLineEdit->setText(dateTime.toString("yyyy/MM/dd HH:mm:ss"));
}
//日期控件显示默认日历
ui.dateEdit->setCalendarPopup(true);
ui.dateTimeEdit->setCalendarPopup(true);
5、水平或竖直滚动条
QScrollBark,一般不单独使用,常配合容器类控件一块使用
6、滑动条
QSlider:
滑动条提供了水平和竖直两种,他是用于控制有界值的典型控件,它允许用户沿着在水平或竖直方向移动滑块,并将滑块所在的位置转换成一个合法范围的数值。
常用函数:
1、setRange() 用来设置滑动条的范围
2、setValue() 可以设置滑块的当前值
3、setMinimum 和setMaxImum()
4、setTickPostion() 设置刻度在滑动条的上方还是下方
5、setTickInterval()设置刻度间隔
ui.horizontalSlider->setRange(0, 299);//设置范围
ui.horizontalSlider->setTickPosition(QSlider::TicksAbove);//保存刻度位置
ui.horizontalSlider->setTickInterval(30);//设置间隔
ui.horizontalSlider->setValue(0);//设置默认值
练习:用滑块控制颜色,用QSpinBox控制红色滑动条
//设置滑动块范围
ui.horizontalSliderRed->setRange(0, 255);
ui.horizontalSliderGreen->setRange(0, 255);
ui.horizontalSliderBlue->setRange(0, 255);
//设置初始值
ui.horizontalSliderRed->setValue(0);
ui.horizontalSliderGreen->setValue(0);
ui.horizontalSliderBlue->setValue(0);
//设置间隔
ui.horizontalSliderRed->setTickInterval(5);
ui.horizontalSliderGreen->setTickInterval(5);
ui.horizontalSliderBlue->setTickInterval(5);
//关联滑动条
connect(ui.horizontalSliderRed, &QSlider::valueChanged, this, &ScrollControlWidget::colorSliderValueChangeSlot);
connect(ui.horizontalSliderGreen, &QSlider::valueChanged, this, &ScrollControlWidget::colorSliderValueChangeSlot);
connect(ui.horizontalSliderBlue, &QSlider::valueChanged, this, &ScrollControlWidget::colorSliderValueChangeSlot);
void ScrollControlWidget::colorSliderValueChangeSlot()
{
int nRel = ui.horizontalSliderRed->value();
int nGreen = ui.horizontalSliderGreen->value();
int nBule = ui.horizontalSliderBlue->value();
//创建颜色对象
QColor color(nRel, nGreen, nBule);
//获取调色板
QPalette pal = ui.textEdit->palette();
//设置颜色
pal.setColor(QPalette::Base, color);
//调色板颜色赋值给QtextEdit
ui.textEdit->setPalette(pal);
}
7、旋转框
QSpinBox:
1、setSingLeStep 改变间隔
2、其他方法与QSlider方法名相同
3、信号:valueChanged(int)或 valueChanged(QString)
//将QSpinBox的范围设置为0-255,在其valueChange信号对应的槽函数中,获取界面值,设置到红色滑动条上
ui.spinBox->setRange(0, 255);
//ui.spinBox->setMaximum(100);//默认最大值
//ui.spinBox->setMinimum(100);//默认最小值
ui.spinBox->setSingleStep(20);
三、显示类控件
1、标签控件
QLabel:用于显示文本或图片,适合显示信息量较小的内容,不能和用户进行交互操作
1、显示文字
ui.textLabel->setAlignment(Qt::AlignTop | Qt::AlignVCenter);//设置文本对齐方式
ui.textLabel->setText(QStringLiteral("通常用于显示文本或图片,适合显示信息量较小的内容,不能和用户进行交互操作"));//设置label上的文本内容
ui.textLabel->setWordWrap(true);//设置换行
ui.textLabel->setFrameShape(QFrame::Box);
ui.textLabel->setToolTip("wwwwwww");
//参数1:字体组名称 参数2:字体大小 参数3:字体粗细
QFont font("Microsoft YaHei", 12, 20);
ui.textLabel->setFont(font);
2、显示gif动图
//创建QMovie对象
QMovie *pMovie = new QMovie(":/ButtonsWidget06/image/findelement.gif");
ui.movieLabel->resize(400, 200);//图片大小
ui.movieLabel->setScaledContents(true);//图片自适应
ui.movieLabel->setMovie(pMovie);//设置动图
pMovie->start();//开始播放
3、显示图片
QPixmap image;
image.load(":/ButtonsWidget06/image/pic3.jpg");//设置图片路径
ui.ImageLabel->setPixmap(image);//添加图片
ui.ImageLabel->setScaledContents(true);//设置图片自适应
2、进度条
ui.progressBar->setMinimum(0);
ui.progressBar->setMaximum(0);
四、容器类控件
容器类控件:可以放置其他控件的控件
1、分组框QGroupBox:通常带有一个边框和标题栏,作为容器部件来使用,在其中可以放各种窗口部件
2、QScrollArea自动滚动区
它使一个容器控件,其中可以放置各种控件,当控件超出其显示范围时,可以通过滚动条来查看子控件。注意:外面控件的大小小于里面控件的大小才会出现滚动条
3、QToolBox选项卡控件(抽屉控件)
它有一组选项卡,每个选项卡下有一个Qwidget控件,我们将子控件放到Qwidget上面
每一个page都有一个索引位置下标,下标从0开始,多个page有顺序的,默认按照添加顺序排布
每个page都有ItemText,还可以设置ItemIcon、itemToolTip等
常用方法:
1、setItemText()设置选项卡的文本
2、setItemIcon()设置图标
3、count()获取数目:有几个page
4、setItemEnbled()将某个选项卡禁能
5、addItem()添加选项卡
1、分组框
2、选项卡控件
//QToolBox
int count = ui.toolBox->count();
qDebug() << count;
//设置工具箱中index位置选项卡的标题
ui.toolBox->setItemText(0, QStringLiteral("小学"));
ui.toolBox->setItemText(1, QStringLiteral("初中"));
ui.toolBox->setItemText(2, QStringLiteral("高中"));
//在工具箱的指定位置添加一个选项卡
ui.toolBox->insertItem(3, new QPushButton,QStringLiteral("大学"));
//给工具箱尾部添加一个选项卡
ui.toolBox->addItem(new QWidget, QStringLiteral("E"));
//给工具箱尾部添加一个带图标的选项卡
QIcon icon(":/ButtonsWidget06/image/1.png");//图标路径
ui.toolBox->addItem(new QWidget, icon, QStringLiteral("F"));
//移除工具箱中索引index位置对应的选项卡, 注意: 小部件没有被删除
//ui.toolBox->removeItem(5);
//设置索引index位置的选项卡是否可用, 参数 enabled=true为可用, enabled=false为禁用
ui.toolBox->setItemEnabled(4, false);
//设置工具箱中index位置选项卡的图标
ui.toolBox->setItemIcon(0, QIcon(":/ButtonsWidget06/image/2.png"));
//设置工具箱中index位置选项卡的提示信息(需要鼠标在选项卡上悬停一定时长才能显示)
ui.toolBox->setItemToolTip(2,QStringLiteral("俺也不知道"));
//如果位置索引的项已启用,则返回true;否则返回false。
qDebug()<<ui.toolBox->isItemEnabled(0);
// 返回位置索引处项目的图标,如果索引超出范围,则返回空图标。
qDebug() << QIcon(ui.toolBox->itemIcon(0));
// 返回工具箱中包含的项的数量。
qDebug() << ui.toolBox->count();
五、项目控件
List Widget
:列表控件Tree Widget
:树形控件Table Widget
:表格控件Qt中用于项处理的组件有两类:
一类是ItemViews,包扩QListView、QtreeView、QTableView和QColumnView等。
一类是Item Widgets,包括QListWidget(项目列表)、QtreeWidget(多层次树)和QTableWidget(表格)
前者基于模型/视图(Model/View),需要自己来建立模型保存数据,这样组织数据可以降低数据冗余,提高编程效率,但需要对模型视图有一点的了解。
后者可以看作前者的升级版,它不需要我们自己去建模,他已经为我们建立了一个数据存储模型QListWidgetItem,我们可以通过addItem()直接使用这个数据模型来添加数据。
1、列表控件
QListWidget常用方法
1、addItem()添加
2、insertItem()插入
3、item()获取
4、takeItem()删除
5、clear()清空
6、setAlternatingRow()开启交替行颜色显示
常用信号:
1、currentItemChange 当前项改变时发出信号
2、itemClicked 点击某些时发出
实现代码:
m_pMenu = new QMenu(this);
m_pAddAction = new QAction(QStringLiteral("添加"));
m_pInsAction = new QAction(QStringLiteral("插入"));
m_pClearAction = new QAction(QStringLiteral("清空"));
m_pMenu->addAction(m_pAddAction);
m_pMenu->addAction(m_pInsAction);
m_pMenu->addAction(m_pClearAction);
connect(m_pAddAction, &QAction::triggered, this, &itemProgect07::on_pushButtonAdd_clicked);
connect(m_pInsAction, &QAction::triggered, this, &itemProgect07::on_pushButtonIns_clicked);
connect(m_pClearAction, &QAction::triggered, this, &itemProgect07::on_pushButtonClear_clicked);
//单选按钮添加到按钮组中并关联槽函数
m_pButtonGroup = new QButtonGroup(this);
m_pButtonGroup->addButton(ui.iconRadioButton, 1);
m_pButtonGroup->addButton(ui.listRadioButton, 0);
connect(m_pButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(OnModeChangeSlot(int)));
//设置QListWidget为列表模式
ui.listWidget->setViewMode(QListView::ListMode);
//初始打开界面,显示图标模式
ui.listRadioButton->setChecked(true);
ui.listWidget->setAlternatingRowColors(true);//行交替显示颜色
绑定的槽函数:
//添加某一行
void itemProgect07::on_pushButtonAdd_clicked()
{
ui.listWidget->addItem(QStringLiteral("山西省"));
//添加带图标的列表项
QIcon icon(":/itemProgect07/image/1.png");
QListWidgetItem *item = new QListWidgetItem(icon, QStringLiteral("河南省"));
ui.listWidget->addItem(item);
QListWidgetItem *item2 = new QListWidgetItem(QIcon(":/itemProgect07/image/2.png"), QStringLiteral("广东省"));
ui.listWidget->addItem(item2);
}
//插入某一行
void itemProgect07::on_pushButtonIns_clicked()
{
QListWidgetItem *item = new QListWidgetItem(QIcon(":/itemProgect07/image/3.png"), QStringLiteral("台湾省"));
//默认获取第0行,如果用户没有点击某行,默认返回下标为0的行
int row = ui.listWidget->currentRow();
//在指定行nRow的上方插入一行
ui.listWidget->insertItem(row, item);
}
//删除某一行
void itemProgect07::on_pushButtonDal_clicked()
{
//方法一
//获取当前行对象
QListWidgetItem *item = ui.listWidget->currentItem();
ui.listWidget->removeItemWidget(item);
//需要手动释放item
delete item;
//方法二
/*int row = ui.listWidget->currentRow();
ui.listWidget->takeItem(row);*/
}
//清空
void itemProgect07::on_pushButtonClear_clicked()
{
ui.listWidget->clear();
}
void itemProgect07::OnModeChangeSlot(int id)
{
if (0 == id)
{
ui.listWidget->setViewMode(QListView::ListMode);
}
else {
ui.listWidget->setViewMode(QListView::IconMode);
}
}
//当前选中项
void itemProgect07::on_listWidget_itemClicked(QListWidgetItem * item)
{
//获取文本
QString strText = item->text();
ui.lineEdit->setText(strText);
}
void itemProgect07::on_listWidget_customContextMenuRequested(const QPoint & pos)
{
//在鼠标光标出现的位置显示菜单
m_pMenu->exec(QCursor::pos());
}
2、树形控件
QTreeWidget的常用方法:
1、setCheckState()
2、childCount()
3、child()
信号:itemClicked
实现代码:
//树形控件
ui.treeWidget->setHeaderHidden(true);//隐藏树形的表头
QTreeWidgetItem *topItem1 = new QTreeWidgetItem(ui.treeWidget);
topItem1->setText(0, QStringLiteral("阿里巴巴"));
topItem1->setCheckState(0, Qt::Unchecked);//默认不选上
ui.treeWidget->addTopLevelItem(topItem1);
//创建研发部子节点
QTreeWidgetItem *developItem = new QTreeWidgetItem(topItem1);
developItem->setText(0, QStringLiteral("研发部"));
developItem->setCheckState(0, Qt::Unchecked);//checked默认选上
//研发一组
QTreeWidgetItem *developOne = new QTreeWidgetItem(developItem);
developOne->setText(0, QStringLiteral("研发一组"));
developOne->setCheckState(0, Qt::Unchecked);
//研发二组
QTreeWidgetItem *developTwo = new QTreeWidgetItem(developItem);
developTwo->setText(0, QStringLiteral("研发二组"));
developTwo->setCheckState(0, Qt::Unchecked);
//创建销售部
QTreeWidgetItem *saleItem = new QTreeWidgetItem(topItem1);
saleItem->setText(0, QStringLiteral("销售部"));
saleItem->setCheckState(0, Qt::Unchecked);
//销售一组
QTreeWidgetItem *saleOne = new QTreeWidgetItem(saleItem);
saleOne->setText(0, QStringLiteral("销售一组"));
saleOne->setCheckState(0, Qt::Unchecked);
//展开所有节点
ui.treeWidget->expandAll();
//点击某个父节点,其下索引子节点的勾选状态会变化
connect(ui.treeWidget, &QTreeWidget::itemClicked, this, &itemProgect07::OnSelectAllItemSlot);
绑定槽函数:
//父层勾选,其子层也勾选
void itemProgect07::OnSelectAllItemSlot(QTreeWidgetItem * item, int column)
{
//获取子节点个数
int size = item->childCount();
for (int i = 0; i < size; i++)
{
//获取子节点item
QTreeWidgetItem *childItem = item->child(i);
if (childItem == nullptr)
{
return;
}
int count = childItem->childCount();
//item->checkState(0):获取父节点的勾选状态,设置给子节点
childItem->setCheckState(0, item->checkState(0));
for (int j = 0; j < count; j++)
{
QTreeWidgetItem *innerChild = childItem->child(j);
if (nullptr != innerChild)
{
innerChild->setCheckState(0, childItem->checkState(0));
}
}
}
}
3、表格控件
QTableWidget,是Qt中的表格组件,用于表示行列组成的二维表,表格一般有表头。
QTableWidget常用方法:
1、setRowCount()
2、setColunmnCount()
3、setHorizontalHeaderItem()
4、setItem()/item()
//初始化表头/标题
void itemProgect07::on_setHeadBtn_clicked()
{
QStringList headList;
headList << QStringLiteral("姓名") << QStringLiteral("性别") << QStringLiteral("学号") << QStringLiteral("年龄") << QStringLiteral("年级");
//设置表格列的数目
ui.tableWidget->setColumnCount(headList.count());
QTableWidgetItem *headItem;
//获取表格中的列数:columnCount()
for (int i = 0; i < ui.tableWidget->columnCount(); i++)
{
headItem = new QTableWidgetItem(headList.at(i));
QFont font = headItem->font();
font.setBold(true);//字体加粗
font.setPointSize(12);//颜色
headItem->setTextColor(Qt::red);//字体颜色
headItem->setFont(font);
ui.tableWidget->setHorizontalHeaderItem(i, headItem);
}
}
//初始化行数
void itemProgect07::on_setRowBtn_clicked()
{
//设置表格的行数,设置10行,行号0-9
ui.tableWidget->setRowCount(ui.spinBox->value());
//设置交易行背景色
ui.tableWidget->setAlternatingRowColors(true);
}
//初始化数据
void itemProgect07::on_initDataBtn_clicked()
{
//姓名、性别、学号、年龄、年级
QString strName, strGender, strNum, strAge, strGrade;
ui.tableWidget->clearContents();//只清除数据,不清楚表头
//行数
int nRow = ui.tableWidget->rowCount();
//行循环
for (int i = 0; i < nRow; i++)
{
if (i % 2 == 0)
{
strGender = QStringLiteral("女");
}
else
{
strGender = QStringLiteral("男");
}
//列循环
for (int j = 0; j < ui.tableWidget->columnCount(); j++)
{
//姓名
if (j == 0)
{
//格式化字符串
strName = QStringLiteral("学生%1哈哈").arg(i);
//创建单元格
QTableWidgetItem *itemName = new QTableWidgetItem(strName);
//单元格内容添加到表格上面
ui.tableWidget->setItem(i, j, itemName);
}
//性别
if (j == 1) {
//性别
QTableWidgetItem *itemGender = new QTableWidgetItem(strGender);
ui.tableWidget->setItem(i, j, itemGender);
}
//学号
if (j == 2) {
strNum = QString("202300%1%2").arg(i).arg(j);
QTableWidgetItem *itemNum = new QTableWidgetItem(strNum);
ui.tableWidget->setItem(i, j, itemNum);
}
//年龄
if (j == 3) {
strAge = QString::number(i + j);
QTableWidgetItem *itemAge = new QTableWidgetItem(strAge);
ui.tableWidget->setItem(i, j, itemAge);
}
//年级
if (j == 4) {
strGrade = QString::number(i + 1);
QTableWidgetItem *itemGrade = new QTableWidgetItem(strGrade);
ui.tableWidget->setItem(i, j, itemGrade);
}
}
}
}
//插入行
void itemProgect07::on_insertRowBtn_clicked()
{
int curRow = ui.tableWidget->currentRow();
if (curRow == -1)
{
QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("请先选择一行"));
return;
}
ui.tableWidget->insertRow(curRow);
for (int i = 0; i < ui.tableWidget->columnCount(); i++)
{
QTableWidgetItem *item = new QTableWidgetItem("Insert");
ui.tableWidget->setItem(curRow, i, item);
}
}
//删除行
void itemProgect07::on_deleteRowBtn_clicked()
{
int nRow = ui.tableWidget->currentRow();
if (nRow == -1)
{
QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("请先选择一行"));
return;
}
ui.tableWidget->removeRow(nRow);
}
//调整行高
void itemProgect07::on_modifyHeigthBth_clicked()
{
ui.tableWidget->resizeRowsToContents();
}
//调整列宽
void itemProgect07::on_modifyWidthBtn_clicked()
{
ui.tableWidget->resizeColumnsToContents();
}
//读取数据
void itemProgect07::on_readDataBtn_clicked()
{
QString strText;
QTableWidgetItem *cellItem;
ui.textEdit->clear();//清空文本块编辑器内容
//逐行
for (int i = 0; i < ui.tableWidget->rowCount(); i++)
{
strText = QStringLiteral("第%1行:").arg(i+1);
//逐列
for (int j = 0; j < ui.tableWidget->columnCount(); j++)
{
cellItem = ui.tableWidget->item(i, j);
QString str = cellItem->text();
//字符串拼接
strText = strText + str +" ";
}
strText += "\n";
ui.textEdit->insertPlainText(strText);
}
}
六、图形视图(了解)
Qt中和图形视图相关的类有三个:QGraphiocsView视图类、QGraphicsScene场景类、QGraphicsItem场景项
前者的关系是场景项(直线、按钮、圆形、文本) 需要添加到场景类中,场景类需要添加到视图类中才能显示出来。
这三个类通常用于二位或三维图形显示开发,能够快速显示万亿级别的视图。
#include<QtWidgets/QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QPushButton>
#include <QGraphicsEllipseItem>
int main(int arg, char *argv[])
{
QApplication a(arg, argv);
//创建场景对象
QGraphicsScene scene(-200, -200, 400, 400);
//创建试图对象并将场景添加到试图中
//方式一:QGraphicsScene提供的默认添加项的方法
QGraphicsItem *item = scene.addText("Hello world", QFont("宋体", 12));
//QPushButton *btn = new QPushButton("button");
//scene.addWidget(btn);
//方式二:自己创建对象,然后添加(灵活,可以自己调整位置)
QGraphicsEllipseItem item1(0, 0,100,100);
item1.setPos(50, 50);
scene.addItem(&item1);
QGraphicsLineItem item2(0, 0, 150, 150);
scene.addItem(&item2);
//展示两个窗口
QGraphicsView view;
view.setScene(&scene);
view.show();
QGraphicsView view1;
view1.setScene(&scene);
view1.show();
return a.exec();
}