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();
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第7章 Qt基于Widget的控件 137 7.1 QLabel控件 137 设置QLabel字体的大小和颜色 137 使用QLabel显示图片 138 图片自适应QLabel的大小 138 7.2 QPushButton控件 138 QPushButton的基本应用 139 QPushButton设置图片 140 7.3 QLineEdit控件 141 QLineEdit基本应用 141 QLineEdit限制输入数字 141 setPlaceholderText()设置提示文字 142 setReadOnly设置不可编辑 142 setMaxLength()设置可以输入的最多字符数 142 setEchoMode()设置模式 142 7.4 QTextEdit控件 143 简介 143 提示占位文本 143 文本内容设置 144 7.4 QPlainTextEdit控件 145 QPlainTextEdit简介 145 QPlainTextEdit富文本 145 QPlainTextEdit用法 145 7.5 QSpinBox控件 146 QSpinBox简介 146 QSpinBox的主要属性 147 QSpinBox案例分析 147 7.6 QRadioButton控件 148 简介 148 在UI界面中加入QRadioButton控件 148 对QRadioButton控件进行分组 149 多个QRadioButton控件响应同一个槽函数 149 7.7 QCheckBox控件 152 简介 152 QCheckBox开启三态模式 152 在UI界面中加入QCheckBox控件 153 stateChanged()信号 153 猜猜你喜欢 154 7.8 QSlider滑动条控件 155 QSlider简介 155 QSlider案例 156 7.9 QComboBox下拉选择框 157 QComboBox简介 157 QComboBox列表项的访问 157 QComboBox的currentlndexChanged信号 157 QComboBox添加图标 159 用代码添加项 159 添加项 159 7.10 列表框QListWidget类 160 QListWidget简介 160 列表项的显示设置 161 列表框常用操作 162 添加操作 162 删除操作 162 7.11 表格控件QTableWidget 163 简介 163 界面设计器中编辑 163 代码方式修改QTableWidget 164 7.12 树控件QTreeWidget 167 简介 167 操作步骤与分析 167 7.13 Qt的日期、时间、日历等控件 169 QDateEdit控件 169 QDateTimeEdit控件 169 QCalendarWidget控件 170 7.14 QDialog 171 简介 171 操作 171 QMessageBox 172 QFileDialog 173 QFontDialog 174 QColorDialog 175
Qt Quick核心编程》起始于基础的开发环境搭建和Qt Creator快速介绍,帮助读者正确使用开发环境;着力于QML语言基础、事件、Qt Quick基本元素,辅以简要的ECMAScript(JavaScript)语言介绍,使得读者能够快速熟悉Qt Quick的基本知识和开发过程;对于Qt Quick中的关键主题,如动画、Model-View、Component、网络、多媒体,做了详尽入微的讲解,让读者一册在手,别无他求;QML与C++混合编程、Canvas、定制及自定义控件等高级主题,《Qt Quick核心编程》也做了详细讲解,同时提供了多个精彩的实作实例,力求概念清晰,用途明确。《Qt Quick核心编程》的内容适用于桌面与Android平台。值得一提的是,《Qt Quick核心编程》覆盖了Android开发的多个主题,如拍照、定位、录音、国际化、可伸缩界面等,也是使用Qt Quick进行移动开发不可错过的。 《Qt Quick核心编程》的读者对象为:希望学习一门高效的界面编程语言开发人员;希望在多个移动设备(如智能手机)上构建流畅用户界面的开发人员;有一定C/C++基础,希望快速构建应用程序界面的开发人员;有一定Qt基础,希望快速构建界面的开发人员;有一定QML基础,想进阶学习的朋友;想熟悉跨平台应用开发框架的开发人员。 目录 第1章 Qt Quick概览 第2章 Qt开发环境快速上手 第3章 QML语言基础 第4章 Qt Quick入门 第5章 ECMAScript初探 第6章 Qt Quick事件处理 第7章 组件与动态对象 第8章 Qt Quick元素布局 第9章 Qt Quick常用元素介绍 第10章 Canvas(画布) 第11章 C++与QML混合编程 第12章 动画 第13章 Model/View 第14章 多媒体 第15章 网络 第16章 定位 第17章 综合实例之文件查看器 第18章 综合实例之聊哈

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值