1.Label
QLabel
可以用来显示文本和图片- 核心属性:
text
:QLabel
中的⽂本textFormat
:⽂本的格式Qt::PlainText
:纯文本Qt::RichText
:富文本(支持html标签)Qt::MarkdownText
:markdown格式Qt::AutoText
:根据文本内容自动决定文本格式
pixmap
:QLabel
内部包含的图片scaledContents
:是否内容自动拉伸填充QLabel
,true/false
alignment
:对齐方式,可设置水平和垂直方向如何对齐wordWrap
:内部文本是否自动换行,true/false
indent
:设置文本缩进,水平和垂直方向都生效- 最多只有两个方向有效,具体哪两个方向取决于
alignment
- 最多只有两个方向有效,具体哪两个方向取决于
margin
:内部文本和边框之间的边距- 不同于
indent
,但是是上下左右四个方向都同时有效
- 不同于
openExternalLinks
:是否允许打开⼀个外部的链接QLabel
文本内容包含url的时候涉及到
buddy
:给QLabel
关联⼀个"伙伴",这样点击QLabel
时就能激活对应的伙伴- 例如:伙伴是⼀个
QCheckBox
,那么该QCheckBox
就会被选中 QLabel
可以通过buddy
指定快捷键- 此处的快捷键的规则功能上要比
QPushButton
弱很多 - 是在文本中使用
&
跟上一个字符来表示快捷键- 例如:
&A
-> 通过键盘上的alt + a
来触发这个快捷键
- 例如:
- 此处的快捷键的规则功能上要比
- 例如:伙伴是⼀个
QFrame
是QLabel
的父类,其中frameShape
属性用来设置边框性质QFrame::Box
:矩形边框QFrame::Panel
:带有可点击区域的面板边框QFrame::WinPanel
:Windows⻛格的边框QFrame::HLine
:⽔平线边框QFrame::VLine
:垂直线边框QFrame::StyledPanel
:带有可点击区域的⾯板边框,但样式取决于窗⼝主题
- 如何让一个控件大小随着窗口大小变化?
- 在
Widget
中重写resizeEvent()
实现// 重写resizeEvent(),这个函数会在窗⼝⼤⼩发⽣改变时被⾃动调⽤ void Widget::resizeEvent(QResizeEvent *event) { // 可以直接通过this->width()和this->height()设置label新的尺⼨ // ui->label->setGeometry(0, 0, this->width(), this->height()); // 也可以通过event参数拿到新的尺寸 ui->label->setGeometry(0, 0, event->size().width(), event >size().height()); }
- 此处的
resizeEvent()
没有手动调用,但是能在窗口大小变化时自动被调用- 这个过程依赖C++中的多态来实现的
- Qt框架内部管理着
QWidget
对象表⽰窗口,在窗口大小发生改变时,Qt会自动调用resizeEvent()
- 但是由于实际上这个表⽰窗⼝的并⾮是
QWidget
,⽽是QWidget
的⼦类,也就是程序员自己是实现的Widget
,此时虽然是通过父类调用函数,但是实际上执行的是子类的函数(重写后的resizeEvent()
) - 此处属于是多态机制的⼀种经典⽤法,通过上述过程,就可以把⾃定义的代码插⼊到框架内部执⾏,相当于"注册回调函数"
- 在
2.LCD Number
QLCDNumer
是⼀个专⻔⽤来显⽰数字的控件,类似于"⽼式计算器"的效果- 核心属性:
intValue
:QLCDNumber
显⽰的数字值(int
)value
:QLCDNumber
显⽰的数字值(double
)- 和
intValue
是联动的- 例如:给
value
设为1.5,intValue
的值就是2
- 例如:给
- 设置
value
和intValue
的⽅法名字为display
,⽽不是setValue
或者setIntValue
- 和
digitCount
:显⽰⼏位数字mode
:数字显⽰形式QLCDNumber::Dec
:⼗进制模式- 只有十进制的时候才能显示小数点后的内容
QLCDNumber::Hex
:⼗六进制模式QLCDNumber::Bin
:⼆进制模式QLCDNumber::Oct
:⼋进制模式
segmentStyle
:设置显⽰⻛格QLCDNumber::Flat
:平⾯的显⽰⻛格,数字呈现在⼀个平坦的表⾯上QLCDNumber::Outline
:轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效果QLCDNumber::Filled
:填充显⽰⻛格,数字被填充颜⾊并与背景区分开
smallDecimalPoint
:设置⽐较⼩的⼩数点
- 示例:定时器
QTimer
:定时器,通过start()
启动之后,就会每隔一定周期,触发一次QTimer::timeour
信号- 使⽤
connect
把QTimer::timeout
信号和Widget::UpdateTime
连接起来,意味着每次触发QTimer::timeout
都会执⾏Widget::UpdateTime
// UpdateTime()实现 { void Widget::UpdateTime() { int value = ui->lcdNumber->intValue(); if(value <= 0) { timer->stop(); return; } ui->lcdNumber->display(value - 1); } } // 功能实现 { // 创建QTimer timer = new QTimer(this); // 连接信号槽,每次触发timeout信号都会伴随updateTime()执行 connect(timer, &QTimer::timeout, this, &Widget::UpdateTime); // 启动Qtimer,并且桂东每个1000ms触发一次timeout信号 timer->start(1000); }
3.ProgressBar
QProgressBar
表示一个进度条- 核心属性:
minimum
:进度条最小值maxinum
:进度条最大值value
:进度条当前值alignment
:文本在进度条中的对齐方式Qt::AlignLeft
:左对⻬Qt::AlignRight
:右对⻬Qt::AlignCenter
:居中对⻬Qt::AlignJustify
:两端对⻬
textVisible
:进度条的数字是否可见orientation
:进度条的方向是水平还是垂直invertAppearance
:是否朝反方向增长进度textDirection
:文本的朝向format
:展示的数字格式%p
:百分比%v
:数值%m
:剩余时间(以ms为单位)%t
:总时间(以ms为单位)
- 示例:设置进度条按时间增长
- 实际开发中,进度条的取值,往往是根据当前任务的实际进度来进⾏设置的
- 例如:需要读取⼀个很⼤的⽂件,就可以获取⽂件的总⼤⼩,和当前读取完毕的⼤⼩,来设置进度条的⽐例
- 由于Qt禁⽌在其他线程修改界⾯,因此进度条的更新往往也是需要搭配定时器来完成的
- 通过定时器周期触发信号,主线程调⽤对应的slot函数
- 再在slot函数中对当前的任务进度进⾏计算,并更新进度条的界⾯效果
// UpdateProgressBar()实现 { void Widget::UpdateProgressBar() { int value = ui->progressBar->value(); if(value >= 100) { timer->stop(); return; } ui->progressBar->serValue(value + 1); } } // 功能实现 { timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Widget::UpdateProgressBar); timer->start(100); }
- 实际开发中,进度条的取值,往往是根据当前任务的实际进度来进⾏设置的
4.Calendar Widget
QCalendarWidget
表⽰⼀个“⽇历”- 核心属性:
selectDate
:当前选中的日期minimumData
:最小日期maximumData
:最大日期firstDayOfWeek
:每周的第一天(日历第一列)是周几gridVisible
:是否显示表格的边框selectionMode
:是否允许选择日期navigationBarVisible
:日历上方标题是否显示horizontalHeaderFormat
:⽇历上⽅标题显⽰的⽇期格式verticalHeaderFormat
:⽇历第⼀列显⽰的内容格式dateEditEnabled
:是否允许⽇期被编辑
- 重要信号:
selectionChanged(const QDate&)
:当选中的⽇期发⽣改变时发出activated(const QDate&)
:当双击⼀个有效的⽇期或者按下回⻋键时发出- 形参是⼀个QDate类型,保存了选中的⽇期
currentPageChanged(int, int)
:当年份⽉份改变时发出- 形参表⽰改变后的新年份和⽉份