QT常用控件篇(3)(上)
一、按钮类控件
1.起源
2.属性
3.要点
autoRepeat:键盘默认支持连点,鼠标默认不支持
shortCut:可以使用字符串,也可以使用枚举类型(这个更安全)
4.代码
//创建图标 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. 练习
//创建三个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 属性)发生改变时触发的。
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.代码
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.代码
//设置初始值 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.代码
//创建一个定时器 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.代码
//当选择的日期发生改变时(就是点击一个时间即可) void MainWindow::on_calendarWidget_selectionChanged() { QDate date = ui->calendarWidget->selectedDate();//获取选择日期 qDebug()<<date; ui->label->setText(date.toString());//日期转成字符串 }