赞
踩
目录
属性
| 说明 |
text
| QLabel 中的⽂本 |
textFormat
|
⽂本的格式.
•
Qt::PlainText
纯⽂本
•
Qt::RichText
富⽂本(⽀持 html 标签)
•
Qt::MarkdownText
markdown 格式
•
Qt::AutoText
根据⽂本内容⾃动决定⽂本格式
|
pixmap
| QLabel 内部包含的图⽚. |
scaledContents
|
设为 true 表⽰内容⾃动拉伸填充
QLabel
设为 false 则不会⾃动拉伸
|
alignment
|
对⻬⽅式.
可以设置⽔平和垂直⽅向如何对⻬.
|
wordWrap
|
设为 true 内部的⽂本会⾃动换⾏.
设为 false 则内部⽂本不会⾃动换⾏.
|
indent
| 设置⽂本缩进. ⽔平和垂直⽅向都⽣效. |
margin
|
内部⽂本和边框之间的边距.
不同于于 indent, 但是是上下左右四个⽅向都同时有效.
⽽ indent 最多只是两个⽅向有效(具体哪两个⽅向有效取决于 alignment )
|
openExternalLinks
|
是否允许打开⼀个外部的链接.
(当 QLabel ⽂本内容包含 url 的时候涉及到)
|
buddy
|
给 QLabel 关联⼀个 "伙伴" , 这样点击 QLabel 时就能激活对应的伙伴.
例如伙伴如果是⼀个 QCheckBox, 那么该 QCheckBox 就会被选中.
|
代码⽰例: 显⽰不同格式的⽂本
1) 在界⾯上创建三个 QLabel
2) 修改 widget.cpp, 设置三个 label 的属性
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- ui->label->setTextFormat(Qt::PlainText);
- ui->label->setText("这是⼀段纯⽂本");
-
- ui->label_2->setTextFormat(Qt::RichText);
- ui->label_2->setText("<b> 这是⼀段富⽂本 </b>");
-
- ui->label_3->setTextFormat(Qt::MarkdownText);
- ui->label_3->setText("## 这是⼀段 markdown ⽂本");
- }
代码示例: 显⽰图⽚
- // 设置 label ⼤⼩和窗⼝⼀样⼤
- ui->label->setGeometry(0, 0, 800, 600);
-
- QPixmap pixmap(":/huaji.png");
- ui->label->setPixmap(pixmap);
- // 设置内容伸缩
- ui->label->setScaledContents(true);
5) 此时, 如果拖动窗⼝⼤⼩, 可以看到图⽚并不会随着窗口大小的改变而同步变化.
- // 重写 resizeEvent. 这个函数会在窗⼝⼤⼩发⽣改变时被⾃动调⽤.
- void Widget::resizeEvent(QResizeEvent *event) {
- // 可以直接通过 this->width() 和 this->height() 设置 label 新的尺⼨
- //也可以通过event 参数拿到新的尺⼨.
-
- // ui->label->setGeometry(0, 0, this->width(), this->height());
- ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
-
- qDebug() << event->size();
- }
此处的 resizeEvent 函数我们没有⼿动调⽤, 但是能在窗⼝⼤⼩变化时被⾃动调⽤.
这个过程就是依赖 C++ 中的多态来实现的. Qt 框架内部管理着 QWidget 对象表⽰咱们的窗 ⼝. 在窗⼝⼤⼩发⽣改变时, Qt 就会⾃动调⽤ resizeEvent 函数.但是由于实际上这个表⽰窗⼝的并⾮是 QWidget, ⽽是 QWidget 的⼦类, 也就是咱们⾃⼰写 的 Widget. 此时虽然是通过⽗类调⽤函数, 但是实际上执⾏的是⼦类的函数(也就是我们重写 后的 resizeEvent ).此处属于是 多态 机制的⼀种经典⽤法. 通过上述过程, 就可以把⾃定义的代码, 插⼊到框架内 部执⾏. 相当于 "注册回调函数" .
属性
| 说明 |
intValue
| QLCDNumber 显⽰的数字值(int). |
value
|
QLCDNumber
显⽰的数字值(double).和 intValue 是联动的.
例如给 value 设为 1.5, intValue 的值就是 2.
另外, 设置 value 和 intValue 的⽅法名字为
display
, ⽽不是
setValue
或者 setIntValue
.
|
digitCoun
| 显⽰⼏位数字. |
mode
|
数字显⽰形式.
1.
QLCDNumber::Dec
:⼗进制模式,显⽰常规的⼗进制数字。
2.
QLCDNumber::Hex
:⼗六进制模式,以⼗六进制格式显⽰数字。
3.
QLCDNumber::Bin
:⼆进制模式,以⼆进制格式显⽰数字。
4.
QLCDNumber::Oct
:⼋进制模式,以⼋进制格式显⽰数字。
只有⼗进制的时候才能显⽰⼩数点后的内容.
|
segmentStyle
|
设置显⽰⻛格.
1.
QLCDNumber::Flat
:平⾯的显⽰⻛格,数字呈现在⼀个平坦的表⾯上。
2.
QLCDNumber::Outline
:轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效果。
3.
QLCDNumber::Filled
:填充显⽰⻛格,数字被填充颜⾊并与背景区分开。
|
smallDecimalPoin
| 设置⽐较⼩的⼩数点. |
代码⽰例: 倒计时
- QTimer* timer;
-
- void updateTime();
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- // 创建 QTimer 实例
- timer = new QTimer(this);
-
- // 连接信号槽. QTimer 会每隔⼀定的时间触发⼀个 timeout 信号. 现在把 timeout 信号
- //和 updateTime 连接起来.
- // 此时意味着每次触发 timeout 信号都会伴随 updateTime 函数的执⾏.
- connect(timer, &QTimer::timeout, this, &Widget::updateTime);
-
- // 启动 QTimer, 并且规定每隔 1000ms 触发⼀次 timeout 信号.
- timer->start(1000);
- }
- void Widget::updateTime() {
- qDebug() << "updateTime";
-
- int value = ui->lcdNumber->intValue();
- if (value <= 0) {
- // 如果时间到, 停⽌定时器.
- timer->stop();
- return;
- }
- ui->lcdNumber->display(value - 1);
- }
5) 执⾏程序, 可以看到每隔⼀秒钟, 显⽰的数字就减少 1.
针对上述代码, 存在两个问题:
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- int value = ui->lcdNumber->intValue();
- while (true) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- if (value <= 0) {
- break;
- }
- ui->lcdNumber->display(value - 1);
- }
- }
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- std::thread t([this]() {
- int value = this->ui->lcdNumber->intValue();
- while (true) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- if (value <= 0) {
- break;
- }
- this->ui->lcdNumber->display(value - 1);
- }
- });
- }
这样的约定主要是因为 GUI 中的状态往往是牵⼀发动全⾝的, 修改⼀个地⽅, 就需要同步的对 其他内容进⾏调整.
⽐如调整了某个元素的尺⼨, 就可能影响到内部的⽂字位置, 或者其他元素的位置. 这⾥⼀连串的修改, 都是需要按照⼀定的顺序来完成的.由于多线程执⾏的顺序⽆法保障, 因此 Qt 从根本上禁⽌了其他线程修改 GUI 状态, 避免后续的⼀系列问题.
使⽤ QProgressBar 表⽰⼀个进度条
属性
| 说明 |
minimum
| 进度条最⼩值 |
maximum
| 进度条最⼤值 |
value
| 进度条当前值 |
alignment
|
⽂本在进度条中的对⻬⽅式.
•
Qt::AlignLeft
: 左对⻬
•
Qt::AlignRight
: 右对⻬
•
Qt::AlignCenter
: 居中对⻬
•
Qt::AlignJustify
: 两端对⻬
|
textVisible
| 进度条的数字是否可⻅. |
orientation
| 进度条的⽅向是⽔平还是垂直 |
invertAppearance
| 是否是朝反⽅向增⻓进度 |
textDirection
| ⽂本的朝向. |
format
|
展⽰的数字格式.
•
%p
:表⽰进度的百分⽐(0-100)
•
%v
:表⽰进度的数值(0-100)
•
%m
:表⽰剩余时间(以毫秒为单位)
•
%t
:表⽰总时间(以毫秒为单位)
|
代码⽰例: 设置进度条按时间增⻓
1) 在界⾯上创建进度条, objectName 为 progressBar
2) 修改 widget.h, 创建 QTimer 和 updateProgressBar 函数.
- QTimer* timer;
- void updateProgressBar ();
3) 修改 widget.cpp, 初始化 QTimer
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- timer = new QTimer(this);
- connect(timer, &QTimer::timeout, this, &Widget::updateProgressBar);
- timer->start(100);
- }
4) 修改 widget.cpp, 实现 updateProgressBar
- void Widget::updateProgressBar() {
- int value = ui->progressBar->value();
- if (value >= 100) {
- timer->stop();
- return;
- }
- ui->progressBar->setValue(value + 1);
- }
5) 运⾏程序, 可以看到进度条中的进度在快速增⻓.
在实际开发中, 进度条的取值, 往往是根据当前任务的实际进度来进⾏设置的.
- ⽐如需要读取⼀个很⼤的⽂件, 就可以获取⽂件的总的⼤⼩, 和当前读取完毕的⼤⼩, 来设置进度条的⽐例.
由于上⾯我们介绍了 Qt 禁⽌在其他线程修改界⾯, 因此进度条的更新往往也是需要搭配定时 器来完成的.通过定时器周期触发信号, 主线程调⽤对应的 slot 函数. 再在 slot 函数中对当前的任务进度进 ⾏计算, 并更新进度条的界⾯效果
属性
| 说明 |
selectDate
| 当前选中的⽇期 |
minimumDate
| 最⼩⽇期 |
maximumDate
| 最⼤⽇期 |
firstDayOfWeek
| 每周的第⼀天(也就是⽇历的第⼀列) 是周⼏. |
gridVisible
| 是否显⽰表格的边框 |
selectionMode
| 是否允许选择⽇期 |
navigationBarVisible
| ⽇历上⽅标题是否显⽰ |
horizontalHeaderFormat
| ⽇历上⽅标题显⽰的⽇期格式 |
verticalHeaderFormat
|
⽇历第⼀列显⽰的内容格式
|
dateEditEnabled
| 是否允许⽇期被编辑 |
重要信号
信号
| 说明 |
selectionChanged(const
QDate&)
|
当选中的⽇期发⽣改变时发出
|
activated(const QDate&)
|
当双击⼀个有效的⽇期或者按下回⻋键时发出,形参是⼀个QDate类型,保存 了选中的⽇期
|
currentPageChanged(int,
int)
| 当年份⽉份改变时发出,形参表⽰改变后的新年份和⽉份 |
代码⽰例: 获取选中的⽇期
2) 给 QCalendarWidget 添加 slot 函数
- void Widget::on_calendarWidget_selectionChanged()
- {
- QDate date = ui->calendarWidget->selectedDate();
- qDebug() << date;
- ui->label->setText(date.toString());
- }
显示类控件是用于在用户界面中显示信息的各种元素,它们可以展示文本、数字、图像等内容。以下是常见的显示类控件及其功能小结:
QLabel:
QLCDNumber:
QProgressBar:
QCalendarWidget:
这些控件在 GUI 开发中经常被使用,可以帮助用户展示和处理各种类型的信息,提高用户体验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。