Qt 5.14.2 学习记录 —— 십일 QLCDNumber、ProgressBar、QCalendarWidget
文章目录
- 1、QLCDNumber
- 2、ProgressBar
- 3、QCalendarWidget
1、QLCDNumber
写一个倒计时程序。拖一个LCD Number到界面:
定时器用Qt的QTimer类,这个类的对象会产生一个timeout信号,通过start方法来开启定时器,并且参数中设定触发timeout信号的周期,单位是ms,之后通过connect给timeout信号绑定上一个槽函数就可以了。
// widget.h
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;QTimer* timer;
};// widget.cpp
#include <QDebug>
#include <QTimer>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lcdNumber->display(10);timer = new QTimer(this);// 先连接再启动timerconnect(timer, &QTimer::timeout, this, &Widget::handle);timer->start(1000);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{int value = ui->lcdNumber->intValue();if (value <= 0){timer->stop();return ;}ui->lcdNumber->display(value - 1);
}
如果不用QTimer类
#include <QTimer>
#include <thread>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lcdNumber->display(10);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);}});
}
用线程去写,是因为如果直接在构造函数里写,那就得等到构造完才能呈现界面,那么数字倒数的界面就无法呈现。但是像上面的代码会出错:terminate called without an active exception,因为Qt中有主线程来维护界面,为了线程安全,Qt不允许其它线程修改界面。之前的槽函数就是由主线程调用的,所以没问题。所以这个思路行不通。
在main.cpp文件中
return a.exec();
这句代码会让主线程进入事件循环,exec一直在循环,每执行一次循环,都会有一些固定的事件来操作。
2、ProgressBar
进度条。
关于对齐
Qt::AlignLeft:左对齐
Qt::AlignRight:右对齐
Qt::AlignCenter:居中对齐
Qt::AlignJustify:两端对齐
放一个ProgressBar到界面上
调整属性,让其初始为0
// widget.h
#include <QTimer>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;QTimer* timer;
};// widget.cpp
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &Widget::handle);timer->start(100);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{int value = ui->progressBar->value();if (value >= 100){timer->stop();return;}ui->progressBar->setValue(value + 1);
}
改个颜色,右键控件,改变样式表
QProgressBar::chunk { background: red;}
chunk就表示进度条中有颜色的那部分。然后改ProgressBar的alignment属性来设定数字对齐方式。
3、QCalendarWidget
日历
信号
selectionChanged(const QDate&) 当选中的日期发生改变时发出。
放一个Label和Calendar Widget
转到日历的selectionChanged槽函数
void Widget::on_calendarWidget_selectionChanged()
{QDate date = ui->calendarWidget->selectedDate();ui->label->setText(date.toString());
}
结束。