QT常用控件篇(3)(上)

一、按钮类控件

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界面会触发未定义行为(崩溃或界面异常),而通过QTimertimeout信号连接的槽函数默认在主线程执行,所以没问题。

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());//日期转成字符串
}