一、按钮类控件
1.起源

2.属性

3.要点
**autoRepeat:**键盘默认支持连点,鼠标默认不支持
**shortCut:**可以使用字符串,也可以使用枚举类型(这个更安全)
4.代码
cpp
//创建图标
QIcon ic("://danta.png");
ui->pushButton->setIcon(ic);//设置图标
ui->pushButton->setIconSize(QSize(50,50));//设置图标大小
//设置快捷键
ui->pushButton_up->setShortcut(QKeySequence("w"));
ui->pushButton_left->setShortcut(QKeySequence("a"));
ui->pushButton_down->setShortcut(QKeySequence("s"));
ui->pushButton_right->setShortcut(QKeySequence("d"));
//设置快捷键方式,这种更好
//ui->pushButton_up->setShortcut(QKeySequence(Qt::Key::Key_W));
//设置连点模式
ui->pushButton_up->setAutoRepeat(true);
1.1 Radio Button(单选按钮)
1.介绍和要点
介绍:
"Radio Button"相关的功能主要用于 在多个互斥选项中进行单项选择**。**
要点:
默认互斥性:同一父窗口下的所有单选按钮默认自动形成一组,同一时间只能选中其中一个,无需额外设置。
手动分组 :若需要在同一个父窗口中创建多个独立的互斥组(例如性别组和学历组),必须使用
QButtonGroup将按钮分别加入不同的组,以实现组间互不干扰。
- checkable: 设置为不可选中时,只是无法留下视觉上的标记,并不代表触发不了信号;而如果是使用 enable(禁用控件),则不仅选不了,也无法触发信号。
2. 练习

cpp
//创建三个QButtonGroup
QButtonGroup* group1 = new QButtonGroup(this);
QButtonGroup* group2 = new QButtonGroup(this);
QButtonGroup* group3 = new QButtonGroup(this);
//分组
group1->addButton(ui->radioButton_1);
group1->addButton(ui->radioButton_2);
group2->addButton(ui->radioButton_3);
group2->addButton(ui->radioButton_4);
group3->addButton(ui->radioButton_5);
group3->addButton(ui->radioButton_6);
1.2 Check Box(多选按钮)
1.介绍和要点
介绍:
"Check Box"相关的功能主要用于 提供多个独立的二选一(开启/关闭)选项,用户可同时勾选多个。
要点:
独立状态(无互斥性) :同一父窗口下的多个复选框默认各自独立,可以同时选中多个或全部不选,这与单选按钮的行为不同。
二者属性

了解几张信号的区别
clicked:是一次完整的鼠标点击动作(即鼠标按下 + 鼠标释放)触发的。
pressed:是鼠标按下的瞬间触发的,不需要等待释放。
released:是鼠标按键释放的瞬间触发的。
toggled:是控件的选中状态(checked 属性)发生改变时触发的。
cpp
ui->radioButton_else->setCheckable(false);//选不中
ui->radioButton_else->setEnabled(false);//选不了
void MainWindow::on_radioButton_man_clicked()
{
ui->label->setText("你选择的性别为: 男");
}
void MainWindow::on_radioButton_clicked_clicked()
{
qDebug()<<"clicked";
}
void MainWindow::on_radioButton_realsed_released()
{
qDebug()<<"released";
}
void MainWindow::on_radioButton_toggled_toggled(bool checked)
{
if(checked == true)
qDebug()<<"toggled true";
else
qDebug() << "toggled false";
}
二、显示类控件
2.1 Label(文本框)
1.介绍和要点
介绍:
"Label"相关的功能主要用于显示静态文本、图像或富文本内容,通常作为其他控件(如输入框、按钮)的说明标签。
2.属性


3.代码
cpp
ui->label->setTextFormat(Qt::PlainText);//纯文本
ui->label->setText("这是一段文本");
ui->label_2->setTextFormat(Qt::RichText);//富文本支持HTML
ui->label_2->setText("<b>这是一段富文本</b>");
ui->label_3->setTextFormat(Qt::MarkdownText);//markdown
ui->label_3->setText("## 这是一段markdown文本");
ui->label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);//垂直水平
ui->label->setWordWrap(true);//自动换行
ui->label->setIndent(20);//首行缩进单位像素
ui->label->setMargin(20);//边距单位像素
ui->label_5->setBuddy(ui->radioButton_2);//设置伙伴

2.2 LCD Number(定时器)
1.介绍和要点
介绍:
"LCD Number"相关的功能主要用于 以液晶数码管(LCD)风格显示数字或特定字符。要点:
要实现每秒递减1 的效果,需要使用定时器;在Qt中,可通过QTimer 类创建对象,该对象会定期发出timeout信号,从而实现该效果。
2.属性

3.代码

cpp
//设置初始值
ui->lcdNumber->display(10);
//创建一个QTimer实例
timer = new QTimer(this);
//判定信号和槽
connect(timer,&QTimer::timeout,this,&MainWindow::Handle);\
//启动定时器
timer->start(1000);//单位是ms
void MainWindow::Handle()
{
//先拿到值
int value = ui->lcdNumber->intValue();
if(value <= 0)
{
timer->stop();//停止定时器
return;
}
ui->lcdNumber->display(value - 1);
}
4.要点
不能直接在构造函数中实现槽函数的倒计时逻辑 ,因为窗口界面需在构造函数执行结束后才会显示 ;若将倒计时逻辑(如循环递减)直接写入构造函数,会导致程序阻塞在构造阶段,界面无法及时渲染 ,最终只能看到倒计时结束后的结果,而无法观察到过程。
在Qt中实现界面更新时,必须确保所有UI操作(如
ui->display)仅在主线程中执行 。子线程直接修改UI界面会触发未定义行为(崩溃或界面异常),而通过QTimer的timeout信号连接的槽函数默认在主线程执行,所以没问题。
2.3 ProgressBar(进度条)
1.介绍和要点
介绍:
"ProgressBar"相关的功能主要用于直观显示耗时操作的执行进度。
2.属性

3.代码

cpp
//创建一个定时器
timer = new QTimer(this);
//绑定信号槽
connect(timer,&QTimer::timeout,this,&MainWindow::Handle);
//启动定时器
timer->start(1000);//毫米为单位
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::Handle()
{
//获取当前进度条数值
int value = ui->progressBar->value();
if(value >= 100)
{
timer->stop();//停止
return;
}
ui->progressBar->setValue(value + 1);
}
2.4 Calendar Widget(日历)
1.介绍和要点
介绍:
"Calendar Widget"相关的功能主要用于提供一个可视化的月历界面,供用户选择和操作日期。
2.属性

3.信号

4.代码

cpp
//当选择的日期发生改变时(就是点击一个时间即可)
void MainWindow::on_calendarWidget_selectionChanged()
{
QDate date = ui->calendarWidget->selectedDate();//获取选择日期
qDebug()<<date;
ui->label->setText(date.toString());//日期转成字符串
}
