三、输入类控件
1.QLineEdit
QLineEdit类对象是一个单行输入框,在其中输入的文本无法换行。其核心属性和核心信号入下表所示。
核心属性:
属性 | 说明 |
---|---|
text | 输入框中的文本 |
inputMask | 输入内容格式约束 |
maxLength | 最大长度 |
frame | 是否添加边框 |
echoMode | 显示方式 • QLineEdit::Normal :这是默认值,文本框会显示输入的文本。 • QLineEdit::Password :在这种模式下,输入的字符会被隐藏,通常用星号(*)或等号(=)代替。 • QLineEdit::NoEcho :在这种模式下,文本框不会显示任何输入的字符。 |
cursorPosition | 光标所在位置 |
alignment | 文字对齐方式, 设置水平和垂直方向的对齐 |
dragEnabled | 是否允许拖拽 |
readOnly | 是否是只读的(不允许修改) |
placeHolderText | 当输入框内容为空的时候, 显示什么样的提示信息 |
clearButtonEnabled | 是否会自动显示出 “清除按钮” |
核心信号:
信号 | 说明 |
---|---|
void cursorPositionChanged(int old, int new) | 当鼠标移动时发出此信号,old为先前的位置,new为新位置。 |
void editingFinished() | 当按返回或者回车键时,或者行编辑失去焦点时,发出此信号。 |
void returnPressed() | 当返回或回车键按下时发出此信号。如果设置了验证器, 必须要验证通过, 才能触发。 |
void selectionChanged() | 当选中的文本改变时,发出此信号。 |
void textChanged(const QString &text) | 当QLineEdit中的文本改变时,发出此信号,text是新的文本。代码对文本的修改能够触发这个信号 |
void textEdited(const QString&text)) | 当QLineEdit中的文本改变时,发出此信号,text是新的文本。代码对文本的修改不能触发这个信号。 |
对于inputMask属性只能进行简单的输入格式校验,对于复杂的格式校验在实际的开发中是基于正则表达式的。正则表达式是计算机中通用的概念和具体的编程语言无关。关于正则表达式的内容可以参考:正则表达式文档,对我们所写的正则表达式可以使用在线工具进行验证,正则表达式在线工具。使用正则表达式时注意转义字符问题,使用在线工具验证时不需要进行转义。
在QT中正则表达式对应的类为QRegExp。正则表达式验证格式的一般步骤如下:
1)创建正则表达式(根据约定格式的正则表达式字符串构造一个QRegExp的类对象),eg:一个电话号码的格式约定,应该以1开头,后面跟10个数字,构造对应的正则表达式对象为:QRegExp regExp(“^1\d{10}$”)。
2)设置一个基于正则表达式的验证器,此处只是注册一个验证器,具体验证器怎么使用还需要其他代码来完成。eg:setValidator(new QRegExpValidator(regExp))。
3)使用验证器验证,State validate(Qstring& str, int& n)。其中str为要进行验证的字符串,n为验证后格式不符的字符串是从哪个位置开始不符合格式的,返回值State一共有三种状态Invalid、Intermediate、Acceptable。
QRegExpValidator是QT内置的,我们也可以自定义一个验证器,通过重写validate函数来实现。
示例代码:
#include "widget.h"
#include "ui_widget.h"
#include <QCheckBox>
#include <QDebug>
#include <QAbstractButton>
#include <QLineEdit>
#include <QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
item.push_back("陕西国防工业职业技术学院");
item.push_back("陕西理工大学");
item.push_back("中国矿业大学");
item.push_back("西安理工大学");
item.push_back("中国石油大学");
item.push_back("中国地质大学");
item.push_back("北京理工大学");
item.push_back("四川理工大学");
item.push_back("成都理工大学");
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
ui->lineEdit->setClearButtonEnabled(true); //设置清除按钮
ui->lineEdit_2->setClearButtonEnabled(true); //设置清除按钮
ui->lineEdit->setPlaceholderText("请输入帐号"); //设置提示文本
ui->lineEdit_2->setPlaceholderText("请输入密码"); //设置提示文本
ui->comboBox->addItems(item);
//约定帐号格式为前三位为学校简称的大写首字母,后面为8位数字
//1.创建正则表达式
QRegExp regExp("^[A-Z]{3}\\d{8}$");
//2.给单行输入框设置一个验证器
ui->lineEdit->setValidator(new QRegExpValidator(regExp));
//3.使用验证器验证,在登录按钮对应的槽函数中进验证
connect(ui->checkBox,&QCheckBox::stateChanged,this,&Widget::checkBox_handle);
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::pBt_handle);
}
void Widget::checkBox_handle()
{
if(ui->checkBox->checkState()==Qt::Checked)
ui->lineEdit_2->setEchoMode(QLineEdit::Normal); //设置回显模式为正常模式
if(ui->checkBox->checkState()==Qt::Unchecked)
ui->lineEdit_2->setEchoMode(QLineEdit::Password); //设置回显模式为密码模式
}
void Widget::pBt_handle()
{
if(!ui->lineEdit->text().isEmpty())
{
int n;
QString str = ui->lineEdit->text();
QValidator::State sta = ui->lineEdit->validator()->validate(str, n); //验证器验证账号格式
if(sta == QValidator::Acceptable)
qDebug()<<"当前帐号:" << ui->lineEdit->text() << "验证成功!";
else
qDebug()<<"当前帐号:" << ui->lineEdit->text() << "验证失败!";
}
}
Widget::~Widget()
{
delete ui;
}
2.QTextEdit/QPlainTextEdit
QTextEdit/QPlainTextEdit都是多行输入文本框,两者区别在于QTextEdit支持多种文本格式,而QPlainTextEdit只支持纯文本格式。两者属性大同小异,此处以QTextEdit说明多行输入框的相关属性和用法。
核心属性:
属性 | 说明 |
---|---|
markdown | 输入框内持有的内容支持 markdown 格式,能够自动的对markdown 文本渲染成 html |
html | 输入框内持有的内容可以支持大部分 html 标签, 包括 img 和 table 等 |
placeHolderText | 输入框为空时提示的内容 |
readOnly | 是否是只读的 |
undoRedoEnable | 是否开启 undo / redo 功能 按下 ctrl + z 触发 undo 按下 ctrl + y 触发 redo |
autoFormating | 开启自动格式化 |
tabstopWidth | 按下缩进占多少空间 |
overwriteMode | 是否开启覆盖写模式 |
acceptRichText | 是否接收富文本内容 |
verticalScrollBarPolicy | 垂直方向滚动条的出现策略 • Qt::ScrollBarAsNeeded : 根据内容自动决定是否需要滚动条。这是默认值。 • Qt::ScrollBarAlwaysOff : 总是关闭滚动条。 • Qt::ScrollBarAlwaysOn : 总是显示滚动条。horizontalScrollBarPolicy 水平方向滚动条的出现策略 • Qt::ScrollBarAsNeeded : 根据内容自动决定是否需要滚动条。这是默认值。 • Qt::ScrollBarAlwaysOff : 总是关闭滚动条。 • Qt::ScrollBarAlwaysOn : 总是显示滚动条。 |
核心信号:
信号 | 说明 |
---|---|
textChanged() | 文本内容改变时触发 |
selectionChanged() | 选中范围改变时触发 |
cursorPositionChanged() | 光标移动时触发 |
undoAvailable(bool) | 可以进行 undo 操作时触发 |
redoAvailable(bool) | 可以进行 redo 操作时触发 |
copyAvaiable(bool) | 文本被选中/取消选中时触发 |
此处写一个界面,可以显示当前文本框中支持的文本格式,文字颜色,撤销按钮和取消撤销按钮(在无法撤销和无法取消撤销状态下按钮为灰色,可撤销和可取消撤销时按钮为正常颜色),同时通过label提示当前文本框中的字数和被鼠标选中的字数。代码如下:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QString>
#include <QTextCursor>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_cmbColor_currentTextChanged(const QString &arg1);
void ctrlz_handle();
void ctrly_handle();
void ctrlzEnable_handle();
void ctrlyEnable_handle();
void wordsNumber();
void selectNumber();
void ctrlz_en(bool stat);
void ctrly_en(bool stat);
void on_cmbFormat_currentTextChanged(const QString &arg1);
private:
Ui::Widget *ui;
QTextCursor cursor;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//cursor = ui->textEdit->textCursor();
QIcon ctrlz(":/res/ctrlz.png");
QIcon ctrly(":/res/ctrly.png");
ui->ctrlz->setEnabled(false);
ui->ctrly->setEnabled(false);
ui->ctrlz->setIcon(ctrlz);
ui->ctrly->setIcon(ctrly);
ui->cmbFormat->addItem("MarkDown");
ui->cmbFormat->addItem("Html");
ui->cmbFormat->addItem("Normal");
ui->cmbColor->addItem("red");
ui->cmbColor->addItem("green");
ui->cmbColor->addItem("blue");
ui->cmbColor->addItem("black");
ui->cmbColor->addItem("yellow");
ui->textEdit->setPlaceholderText("请输入文本内容");
connect(ui->ctrlz,&QPushButton::clicked,this,&Widget::ctrlz_handle);
connect(ui->ctrly,&QPushButton::clicked,this,&Widget::ctrly_handle);
connect(ui->textEdit,&QTextEdit::textChanged,this,&Widget::wordsNumber);
connect(ui->textEdit,&QTextEdit::selectionChanged,this,&Widget::selectNumber);
connect(ui->textEdit,&QTextEdit::undoAvailable,this,&Widget::ctrlz_en);
connect(ui->textEdit,&QTextEdit::redoAvailable,this,&Widget::ctrly_en);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_cmbColor_currentTextChanged(const QString &arg1)
{
ui->textEdit->setTextColor(arg1);
}
void Widget::ctrlz_handle()
{
ui->textEdit->undo();
}
void Widget::ctrly_handle()
{
ui->textEdit->redo();
}
void Widget::ctrlzEnable_handle()
{
ui->ctrlz->setEnabled(true);
}
void Widget::ctrlyEnable_handle()
{
ui->ctrly->setEnabled(true);
}
void Widget::wordsNumber()
{
ui->label_2->setText(QString("当前字数:")+QString::number(ui->textEdit->toPlainText().size()));
}
void Widget::selectNumber()
{
qDebug() << "selectChanged";
//qDebug() << ui->textEdit->textCursor().selectedText();
//ui->label_3->setText(QString("选中字数:")+QString::number(cursor.selectedText().size()));
ui->label_3->setText(QString("选中字数:")+QString::number(ui->textEdit->textCursor().selectedText().size()));
}
void Widget::ctrlz_en(bool stat)
{
qDebug() << "ctrlz_en";
if(stat)
ui->ctrlz->setEnabled(true);
else
ui->ctrlz->setEnabled(false);
}
void Widget::ctrly_en(bool stat)
{
qDebug() << "ctrlz_en";
if(stat)
ui->ctrly->setEnabled(true);
else
ui->ctrly->setEnabled(false);
}
void Widget::on_cmbFormat_currentTextChanged(const QString &arg1)
{
if(arg1 == "MarkDown")
{
ui->textEdit->setMarkdown(ui->textEdit->toPlainText());
qDebug()<< "markdown";
}
else if(arg1 == "Html")
{
ui->textEdit->setHtml(ui->textEdit->toPlainText());
qDebug()<< "Html";
}
else
{
ui->textEdit->setPlainText(ui->textEdit->toPlainText());
qDebug()<< "Normal";
}
}
几点注意:
1)使用信号和槽实现撤销/取消撤销按钮的使能和失能时,槽函数如何获取信号中传来的参数。之前在QT专栏的信号与槽的文章中第3点已经讲过了。QT中信号和槽机制
2)使用QTextCursor获取被选中内容时注意,下图所示问题。所以此时我们在对cursor进行赋值时不要在构造函数中进行,直接在对应的槽函数中进行即可解决。
3.QCombox
QCombox是一种复选框,类似于下拉菜单,但每次可以从列出的选项中选择一个。
核心属性:
属性 | 说明 |
---|---|
currentText | 当前选中的文本 |
currentIndex | 当前选中的条目下标 |
从 0 开始计算 | 如果当前没有条目被选中, 值为 -1 |
editable | 是否允许修改。设为 true 时, QComboBox 的行为就非常接近 QLineEdit , 也可以设置 validator |
iconSize | 下拉框图标 (小三角) 的大小 |
maxCount | 最多允许有多少个条目 |
核心方法:
方法 | 说明 |
---|---|
addItem(const QString&) | 添加一个条目 |
currentIndex() | 获取当前条目的下标。从 0 开始计算,如果当前没有条目被选中, 值为 -1 |
currentText() | 获取当前条目的文本内容 |
核心信号:
信号 | 说明 |
---|---|
activated(int) activated(const QString & text) | 当用户选择了一个选项时发出,这个时候相当于用户点开下拉框, 并且鼠标划过某个选项,此时还没有确认做出选择 |
currentIndexChanged(int) currentIndexChanged(const QString& text) | 当前选项改变时发出。此时用户已经明确的选择了一个选项用户操作或者通过程序操作都会触发这个信号 |
editTextChanged(const QString &text) | 当编辑框中的文本改变时发出(editable 为 true 时有效) |
comBox的内容不多,此处主要介绍一下从文件中读取选项到comBox中。
4.QSpinBox/QDoubleSpinBox
QSpinBox/QDoubleSpinBox 表示 “微调框”,它是带有按钮的输入框,可以用来输入整
数/浮点数,通过点击按钮来修改数值大小。由于SpinBox和QDoubleSpinBox用法基本相同,就以SpinBox 为例进行介绍。
核心属性:
属性 | 说明 |
---|---|
value | 存储的数值 |
singleStep | 每次调整的 “步长”,按下一次按钮数据变化多少 |
displayInteger | 数字的进制,例如 displayInteger 设为 10,则是按照 10 进制表示,设为 2 则为 2进制表示 |
minimum | 最小值 |
maximum | 最大值 |
suffix | 后缀 |
prefix | 前缀 |
wrapping | 是否允许换行 |
frame | 是否带边框 |
alignment | 文字对齐方式 |
readOnly | 是否允许修改 |
buttonSymbol | 按钮上的图标 • UpDownArrows 上下箭头形式 • PlusMinus 加减号形式 • NoButtons 没有按钮 |
accelerated | (加速的) 按下按钮时是否为快速调整模式 |
correctionMode | 输入有误时如何修正 • QAbstractSpinBox::CorrectToPreviousValue : 如果用户输入了一个无效的值(例如,在只能显示正整数的SpinBox中输入了负数),那么SpinBox会恢复为上一个有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),然后SpinBox会恢复为1。 • QAbstractSpinBox::CorrectToNearestValue : 如果用户输入了一个无效的值,SpinBox会恢复为最接近的有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),那么SpinBox会恢复为0 |
keyboardTrack | 是否开启键盘跟踪。设为 true, 每次在输入框输入一个数字, 都会触发一次 valueChanged() 和textChanged() 信号。设为 false, 只有在最终按下 enter 或者输入框失去焦点, 才会触发valueChanged() 和 textChanged() 信号 |
核心信号:
信号 | 说明 |
---|---|
textChanged(QString) | 微调框的文本发生改变时会触发,参数 QString 带有 前缀 和 后缀 |
valueChanged(int) | 微调框的文本发生改变时会触发,参数 int,表示当前的数值 |
此处写一个界面,使用spinBox调整图片大小,以此介绍相关属性设置和核心信号的使用,代码如下:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QSpinBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
void ctrl_w(int w);
void ctrl_h(int h);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPixmap pixmap(":/res/R-C.jpeg");
// pixmap.scaled(QSize(ui->label->width()/2,ui->label->height()/2));
// ui->label->setPixmap(pixmap);
ui->label->setPixmap( pixmap.scaled(QSize(ui->label->width()/2,ui->label->height()/2)));
ui->spinBox->setRange(40,400); //设置调整范围
ui->spinBox->setSingleStep(1); //设置单步步长
ui->spinBox->setPrefix("宽度"); //设置前缀
ui->spinBox->setSuffix("像素"); //设置后缀
ui->spinBox->setDisplayIntegerBase(10); //设置数值显示进制
ui->spinBox->setReadOnly(false); //可编辑
ui->spinBox->setAccelerated(true); //可加速调整
ui->spinBox->setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue); //错误值纠正模式
ui->spinBox->setKeyboardTracking(false); //不进行键盘追踪
ui->spinBox_2->setRange(40,400); //设置调整范围
ui->spinBox_2->setSingleStep(1); //设置单步步长
ui->spinBox_2->setPrefix("高度"); //设置前缀
ui->spinBox_2->setSuffix("像素"); //设置后缀
ui->spinBox_2->setDisplayIntegerBase(10); //设置数值显示进制
ui->spinBox_2->setReadOnly(false); //可编辑
ui->spinBox_2->setAccelerated(true); //可加速调整
ui->spinBox->setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue); //错误值纠正模式
ui->spinBox_2->setKeyboardTracking(false); //不进行键盘追踪
// connect(ui->spinBox,&QSpinBox::valueChanged,this,&Widget::ctrl_w);
// connect(ui->spinBox_2,&QSpinBox::valueChanged,this,&Widget::ctrl_h);
connect(ui->spinBox,static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),this,&Widget::ctrl_w);
connect(ui->spinBox_2,static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),this,&Widget::ctrl_h);
}
void Widget::ctrl_w(int w)
{
ui->label->setGeometry((width()-w)/2,(height()-ui->spinBox_2->value()-100)/2,w,ui->spinBox_2->value());
ui->label->setPixmap( QPixmap(":/res/R-C.jpeg").scaled(QSize(ui->label->width(),ui->label->height())));
qDebug() << "当前图片像素:" << w <<"X"<<ui->spinBox_2->value();
}
void Widget::ctrl_h(int h)
{
ui->label->setGeometry((width()-ui->spinBox->value())/2,(height()-h-100)/2,ui->spinBox->value(),h);
ui->label->setPixmap( QPixmap(":/res/R-C.jpeg").scaled(QSize(ui->label->width(),ui->label->height())));
qDebug() << "当前图片像素:" << ui->spinBox->value() <<"X"<<h;
}
Widget::~Widget()
{
delete ui;
}
注意使用connect连接信号valueChanged和槽函数时报错的问题,可参考博客:connect报错
5.QDateEdit / QTimeEdit / QDataTimeEdit
这几个控件用法非常相似, 是时间/日期类的一个微调框,此处以 QDateTimeEdit 为例进行介绍。
核心属性:
属性 | 说明 |
---|---|
dateTime | 时间日期的值,形如 2000/1/1 0:00:00 |
date | 单纯日期的值, 形如 2001/1/1 |
time | 单纯时间的值,形如 0:00:00 |
displayFormat | 时间日期格式,形如 yyyy/M/d H:mm • y 表示年份 • M 表示月份 • d 表示日期 • H 表示小时 • m 表示分钟 • s 表示秒 注意: 这里的格式化符号的含义, 不要记忆。不同语言/库的设定规则是存在差异的,一定是用的时候再去查 |
minimumDateTime | 最小时间日期 |
maximumDateTime | 最大时间日期 |
timeSpec | • Qt::LocalTime :显示本地时间 • Qt::UTC :显示协调世界时(UTC) • Qt::OffsetFromUTC :显示相对于UTC的偏移量(时差) |
注意:UTC 时间是一个基于原子钟的标准时间. 不受地球的自转周期影响。和格林威治时间 (GMT) 是非常接近的, 科学家会通过精密的设备来测量并维护。咱们的计算机内部使用的时间就是基于 UTC 时间。本地时间则是基于不同的时区,对 UTC 时间做出了一些调整. 比如咱们使用的北京时间, 位于"东八区",就需要在 UTC 时间基础上 +8 个小时的时差。
核心信号:
信号 | 说明 |
---|---|
dateChanged(QDate) | 日期改变时触发 |
timeChanged(QTime) | 时间改变时触发 |
dateTimeChanged(QDateTime) | 时间日期任意一个改变时触发 |
此处以两个日期时间微调框,通过获取其值计算两个日期之间的天数为例说明该控件的相关属性和用法。代码如下:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QDateTimeEdit>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
void pBt_handle();
void DTE_handle(QDateTime in);
void DTE_handle2(QDateTime in);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
ui->dateTimeEdit_2->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::pBt_handle);
connect(ui->dateTimeEdit,&QDateTimeEdit::dateTimeChanged,this,&Widget::DTE_handle);
connect(ui->dateTimeEdit_2,&QDateTimeEdit::dateTimeChanged,this,&Widget::DTE_handle2);
}
void Widget::pBt_handle()
{
QString ret("从");
ret += QString::number(ui->dateTimeEdit->dateTime().date().year())+"-"+QString::number(ui->dateTimeEdit->dateTime().date().month())+"-"+QString::number(ui->dateTimeEdit->dateTime().date().day())+" "+ui->dateTimeEdit->dateTime().time().toString();
ret += "到";
ret += QString::number(ui->dateTimeEdit_2->dateTime().date().year())+"-"+QString::number(ui->dateTimeEdit_2->dateTime().date().month())+"-"+QString::number(ui->dateTimeEdit_2->dateTime().date().day())+" "+ui->dateTimeEdit_2->dateTime().time().toString();
ret += "共";
long int seconds = ui->dateTimeEdit->dateTime().secsTo(ui->dateTimeEdit_2->dateTime());//注意此处如果使用daysTo()进行计算会出现几个小时不到一天的情况下当成一天算,计算不准确
int day = seconds/3600/24;
int hour = seconds/3600%24;
ret += QString::number(day);
ret += "天";
ret += QString::number(hour);
ret += "小时";
int min = (seconds - day*24*3600 - hour*3600)/60;
int sec = (seconds - day*24*3600 - hour*3600)%60;
ret += QString::number(min);
ret += "分钟";
ret += QString::number(sec);
ret += "秒";
ui->label->setText(ret);
}
void Widget::DTE_handle(QDateTime in)
{
qDebug()<<in<<"----"<<ui->dateTimeEdit_2->dateTime();
}
void Widget::DTE_handle2(QDateTime in)
{
qDebug()<<ui->dateTimeEdit->dateTime()<<"----"<<in;
}
Widget::~Widget()
{
delete ui;
}
6.QDial
QDial表示旋钮类,旋钮在不同位置表示不同的数值,以此来设置或改变某些参数。
核心属性:
属性 | 说明 |
---|---|
value | 持有的数值 |
minimum | 最小值 |
maximum | 最大值 |
singleStep | 按下方向键的时候改变的步长 |
pageStep | 按下 pageUp / pageDown 的时候改变的步长 |
sliderPosition | 界面上旋钮显示的 初始位置 |
tracking | 外观是否会跟踪数值变化 默认值为 true,一般不需要修改 |
wrapping | 是否允许循环调整,即数值如果超过最大值, 是否允许回到最小值(调整过程能否 “套圈”) |
notchesVisible | 是否显示 刻度线 |
notchTarget | 刻度线之间的相对位置,数字越大,刻度线越稀疏 |
核心信号:
信号 | 说明 |
---|---|
valueChanged(int) | 数值改变时触发 |
rangeChanged(int, int) | 范围变化时触发 |
此处使用一个dail来调整窗口的透明度,以此来介绍该控件的相关属性,代码如下:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDial>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
void opacity_handle(int cp);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QDial* dial = new QDial(this);
dial->setGeometry((width()-200)/2,(height()-200)/2,200,200);
dial->setSliderPosition(100);
dial->setNotchesVisible(true);
dial->setNotchTarget(0.1);
dial->setWrapping(false);
dial->setRange(0,100);
connect(dial,&QDial::valueChanged,this,&Widget::opacity_handle);
}
void Widget::opacity_handle(int cp)
{
setWindowOpacity(cp/100.0);
}
Widget::~Widget()
{
delete ui;
}
7.QSlider
QSlider表示一个滚动条,QSlider 和 QDial 都是继承自 QAbstractSlider,因此用法上基本相同。
核心属性:
属性 | 说明 |
---|---|
value | 持有的数值 |
minimum | 最小值 |
maximum | 最大值 |
singleStep | 按下方向键的时候改变的步长 |
pageStep | 按下 pageUp / pageDown 的时候改变的步长 |
sliderPosition | 滑动条显示的 初始位置 |
tracking | 外观是否会跟踪数值变化,默认值为 true 一般不需要修改 |
orientation | 滑动条的方向是水平还是垂直 |
invertedAppearance | 是否要翻转滑动条的方向 |
tickPosition | 刻度的位置 |
tickInterval | 刻度的密集程度 |
核心信号:
信号 | 说明 |
---|---|
valueChanged(int) | 数值改变时触发 |
rangeChanged(int, int) | 范围变化时触发 |
此处以两个滚动条,分别调整图片的宽度和高度来说明控件的相关属性和用法。代码如下:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
void width_handle(int w);
void height_handle(int h);
~Widget();
private:
Ui::Widget *ui;
QPixmap pixmap;
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
pixmap = QPixmap(":/1.jpg");
ui->label->setPixmap(pixmap);
ui->horizontalSlider->setRange(51,516);
ui->horizontalSlider->setSliderPosition(516);
ui->verticalSlider->setRange(34,344);
ui->verticalSlider->setSliderPosition(344);
connect(ui->horizontalSlider,&QSlider::valueChanged,this,&Widget::width_handle);
connect(ui->verticalSlider,&QSlider::valueChanged,this,&Widget::height_handle);
}
void Widget::width_handle(int w)
{
QSize sz(w,ui->label->height());
ui->label->setGeometry((width()-w)/2,(height()-ui->label->height())/2,w,ui->label->height());
QPixmap tmp = pixmap.scaled(sz);
ui->label->setPixmap(tmp);
qDebug()<<"图片大小:"<<w<<"X"<<ui->label->height();
}
void Widget::height_handle(int h)
{
QSize sz(ui->label->width(),h);
ui->label->setGeometry((width() - ui->label->width())/2,(height()-h)/2,ui->label->width(),h);
QPixmap tmp = pixmap.scaled(sz);
ui->label->setPixmap(tmp);
qDebug()<<"图片大小:"<<ui->label->width()<< "X"<<h;
}
Widget::~Widget()
{
delete ui;
}