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

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