ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Qt 按钮类控件详解

Qt 按钮类控件详解 目录 1.按钮类控件 1.1 Push Button 1.2 Radio Button1.3 Check Box️ 1.4 Tool Button 小结经典面试题 1.按钮类控件 1.1 Push ButtonQPushButton继承⾃QAbstractButton .。这个类是⼀个抽象类. 是其他按钮的⽗类QAbstractButton中, 和QPushButton相关性较⼤的属性。 1.QAbstractButton作为QWidget的⼦类, 当然也继承了QWidget的属性. 上⾯介绍的QWidget⾥的各种属性⽤法, 对于QAbstractButton同样适⽤. 因此表格仅列出QAbstractButton独有的属性.2. Qt 的 api 设计⻛格是⾮常清晰的. 此处列出的属性都是可以 获取 和 设置 的. 例如, 使⽤text()获取按钮⽂本; 使⽤setText()设置⽂本.事实上,QPushButton的核⼼功能都是QAbstractButton提供的. ⾃⾝提供的属性都⽐较简单.其中default和audoDefault影响的是按下enter时⾃动点击哪个按钮的⾏为;flat把按钮设置为扁平的样式. 这⾥我们暂时都不做过多关注.代码⽰例: 带有图标的按钮创建resource.qrc⽂件, 并导⼊图⽚**注意**在Qt Creator中创建好qrc文件后切换到代码编辑框编写代码如果在想切换回到刚才的qrc编辑器此时点击左侧的qrc文件很可能会失效 此时可以点击代码上方的下拉框来进行切换。在界⾯上创建⼀个 按钮修改 widget.cpp, 给按钮设置图标#includewidget.h#includeui_widget.h#includeQIcon#includeQPushButtonWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);//创建图标QIconicon(:/md.svg);//设置图标ui-btn-setIcon(icon);//设置图标大小ui-btn-setIconSize(QSize(50,50));}Widget::~Widget(){deleteui;} 把图片导入项目的时候由于图片多了不想在继续放在项目根目录下了就可以创建image目录再把图片放到image目录中此时就意味着后续访问这些图片就需要在路径当中带上image这一目录名字。执⾏程序, 观察效果代码⽰例: 带有快捷键的按钮在界⾯中拖五个按钮.五个按钮的objectName分别为target,up,down,left,right五个按钮的初始位置随意, 其中target尺⼨设置为100 * 100, 其余按钮设为50 * 50. ⽂本内容均清空创建resource.qrc, 并导⼊ 5 个图⽚.修改 widget.cpp, 设置图标资源和快捷键使⽤setShortcut给按钮设置快捷键. 参数是⼀个QKeySequence对象. 表⽰⼀个按键序列. ⽀持组合键 (ctrl c这种).QKeySequence的构造函数参数, 可以直接使⽤ “ctrlc” 这样的按键名字符串表⽰, 也可以使⽤预定义好的常量 (形如Qt::CTRL Qt::Key_C) 表⽰.#includewidget.h#includeui_widget.h#includeQIcon#includeQPushButton#includeQIcon#includeQShortcutWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);//设置图标ui-target-setIcon(QIcon(:/md.svg));ui-up-setIcon(QIcon(:/up.svg));ui-down-setIcon(QIcon(:/down.svg));ui-left-setIcon(QIcon(:/left.svg));ui-right-setIcon(QIcon(:/right.svg));//设置快捷键ui-up-setShortcut(QKeySequence(w));ui-down-setShortcut(QKeySequence(s));ui-left-setShortcut(QKeySequence(a));ui-right-setShortcut(QKeySequence(d));// //快捷键也可以写作// ui-up-setShortCut(QKeySequence(Qt::Key_W));// ui-down-setShortCut(QKeySequence(Qt::Key_S));// ui-left-setShortCut(QKeySequence(Qt::Key_A));// ui-right-setShortCut(QKeySequence(Qt::Key_D));}Widget::~Widget(){deleteui;}4) 修改widget.cpp, 设置四个⽅向键的slot函数#includewidget.h#includeui_widget.h#includeQIcon#includeQPushButton#includeQIcon#includeQShortcut#includeQDebugWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);//设置图标ui-target-setIconSize(QSize(100,100));ui-target-setIcon(QIcon(:/md.svg));ui-up-setIcon(QIcon(:/up.svg));ui-down-setIcon(QIcon(:/down.svg));ui-left-setIcon(QIcon(:/left.svg));ui-right-setIcon(QIcon(:/right.svg));//设置快捷键ui-up-setShortcut(QKeySequence(w));ui-down-setShortcut(QKeySequence(s));ui-left-setShortcut(QKeySequence(a));ui-right-setShortcut(QKeySequence(d));// //快捷键也可以写作// ui-up-setShortCut(QKeySequence(Qt::Key_W));// ui-down-setShortCut(QKeySequence(Qt::Key_S));// ui-left-setShortCut(QKeySequence(Qt::Key_A));// ui-right-setShortCut(QKeySequence(Qt::Key_D));}Widget::~Widget(){deleteui;}voidWidget::on_up_clicked(){constQRectrectui-target-geometry();ui-target-setGeometry(rect.x(),rect.y()-5,rect.width(),rect.height());qDebug()up;}voidWidget::on_left_clicked(){constQRectrectui-target-geometry();ui-target-setGeometry(rect.x()-5,rect.y(),rect.width(),rect.height());qDebug()left;}voidWidget::on_right_clicked(){constQRectrectui-target-geometry();ui-target-setGeometry(rect.x()5,rect.y(),rect.width(),rect.height());qDebug()right;}voidWidget::on_down_clicked(){constQRectrectui-target-geometry();ui-target-setGeometry(rect.x(),rect.y()5,rect.width(),rect.height());qDebug()down;}运⾏程序, 此时点击按钮, 或者使⽤wasd均可让target移动.代码⽰例: 按钮的重复触发在上述案例中, 按住快捷键, 是可以进⾏重复触发的. 但是⿏标点击则不能.修改widget.cpp, 在构造函数中开启重复触发.#includewidget.h#includeui_widget.h#includeQIcon#includeQPushButton#includeQIcon#includeQShortcut#includeQDebugWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);//设置图标ui-target-setIconSize(QSize(100,100));ui-target-setIcon(QIcon(:/md.svg));ui-up-setIcon(QIcon(:/up.svg));ui-down-setIcon(QIcon(:/down.svg));ui-left-setIcon(QIcon(:/left.svg));ui-right-setIcon(QIcon(:/right.svg));//设置快捷键ui-up-setShortcut(QKeySequence(w));ui-down-setShortcut(QKeySequence(s));ui-left-setShortcut(QKeySequence(a));ui-right-setShortcut(QKeySequence(d));// //快捷键也可以写作// ui-up-setShortCut(QKeySequence(Qt::Key_W));// ui-down-setShortCut(QKeySequence(Qt::Key_S));// ui-left-setShortCut(QKeySequence(Qt::Key_A));// ui-right-setShortCut(QKeySequence(Qt::Key_D));//开启重复触发 - 连击效果ui-up-setAutoRepeat(true);ui-down-setAutoRepeat(true);ui-left-setAutoRepeat(true);ui-right-setAutoRepeat(true);}此时, 按住⿏标时, 即可让target连续移动。 1.2 Radio Buttiononon说明QRadioButton 是单选按钮. 可以让我们在多个选项中选择⼀个.作为 QAbstractButton 和 QWidget 的⼦类, 上⾯介绍的属性和⽤法, 对于QRadioButton同样适⽤.QAbstractButton中和QRadioButton关系较⼤的属性代码⽰例: 选择性别在界⾯上创建⼀个label, 和 3 个 单选按钮设置的⽂本如下图. 3 个单选按钮的objectName分别为male,female,other.修改widget.cpp, 编辑三个QRadioButton的slot函数.#includewidget.h#includeui_widget.hWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);}Widget::~Widget(){deleteui;}voidWidget::on_male_clicked(){ui-label-setText(你选择的性别是男);}voidWidget::on_female_clicked(){ui-label-setText(你选择的性别是女);}voidWidget::on_other_clicked(){ui-label-setText(你选择的性别是其他);}运⾏程序, 可以看到随着选择不同的单选按钮,label中的提⽰⽂字就会随之变化。当前代码中, 如果程序启动, 则不会选择任何选项.可以修改代码, 让程序启动默认选中性别男//设置默认选择该按钮ui-male-setChecked(true);ui-label-setText(你选择的性别是男);此时运⾏程序, 即可看到 性别男 已经被选中了当前代码中, 也可以禁⽤ “其他” 被选中.修改widget.cpp的构造函数// 禁⽤ other 选项ui-radioButton_other-setCheckable(false);运⾏程序, 可以看到, 点击 “其他” 按钮的时候, 虽然不会被选中, 但是可以触发点击事件, 使上⾯label显⽰性别为其他.使⽤setEnabled是更彻底的禁⽤按钮的⽅式. 此时该按钮⽆法被选中, 也⽆法响应任何输⼊// 禁⽤ other 选项ui-radioButton_other-setEnabled(false);代码⽰例:click,press,release,toggled的区别clicked表⽰⼀次 “点击”pressed表⽰⿏标 “按下”released表⽰⿏标 “释放”toggled表⽰按钮状态切换.在界⾯上创建四个单选按钮objectName分别为radioButton,radioButton_2,radioButton_3,radioButton_4给 1 创建clicked槽函数, 给 2 创建pressed槽函数, 给 3 创建released槽函数,给 4 创建toggled槽函数.#includewidget.h#includeui_widget.h#includeQDebugWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);}Widget::~Widget(){deleteui;}voidWidget::on_radioButton_clicked(){qDebug()clicked;}voidWidget::on_radioButton_2_pressed(){qDebug()pressed;}voidWidget::on_radioButton_3_released(){qDebug()released;}voidWidget::on_radioButton_4_toggled(boolchecked){if(checked){qDebug()toggled checked true;}else{qDebug()toggled checked false;}}运⾏程序, 可以看到clicked是⼀次⿏标按下⿏标释放触发的.pressed是⿏标按下触发的.released是⿏标释放触发的.toggled是checked属性改变时触发的.总的来说,toggled是最适合QRadioButton的.代码⽰例: 单选框分组在界⾯上创建 6 个单选框, ⽤来模拟⻨当劳点餐界⾯.objectName分别为radioButton到radioButton_6此时直接运⾏程序, 可以看到, 这六个QRadioButton之间都是排他的.我们希望每⼀组内部来控制排他, 但是组和组之间不能排他.引⼊QButtonGroup进⾏分组修改widget.cpp#includewidget.h#includeui_widget.h#includeQButtonGroupWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);//创建三个QButtonGroupQButtonGroup*group1newQButtonGroup(this);QButtonGroup*group2newQButtonGroup(this);QButtonGroup*group3newQButtonGroup(this);//把QRadioButton两两一组放到三个QButtonGroup中group1-addButton(ui-radioButton);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);}Widget::~Widget(){deleteui;}再次执⾏程序, 可以看到可以按照正确的分组⽅式来完成排他了.说明汉堡小食饮料中的每个类别中都只能选一项不能两项都1.3 Check BoxBoxQCheckBox表⽰复选按钮.可以允许选中多个.和QCheckBox最相关的属性也是checkable和checked, 都是继承⾃QAbstractButton.⾄于QCheckBox独有的属性tristate⽤来实现 “三态复选框” . 这个东西⽐较冷⻔.代码⽰例: 获取复选按钮的取值在界⾯上创建 三个复选按钮, 和⼀个普通按钮objectName分别为checkBox_eat,checkBox_sleep,checkBox_play, 以及pushButton给pushButton添加slot函数#includewidget.h#includeui_widget.h#includeQDebugWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);}Widget::~Widget(){deleteui;}voidWidget::on_pushButton_clicked(){QString result;if(ui-checkBox_sleep-isChecked()){resultui-checkBox_sleep-text();}if(ui-checkBox_eat-isChecked()){resultui-checkBox_eat-text();}if(ui-checkBox_game-isChecked()){resultui-checkBox_game-text();}qDebug()选中的内容是result;}运⾏程序, 可以看到点击确认按钮时, 就会在控制台中输出选中的内容.️ 1.4 Tool ButtontonntonQToolButton的⼤部分功能, 和QPushButton是⼀致的. 但是QToolButton主要应⽤在⼯具栏, 菜单等场景 小结本文详细介绍了 Qt 中常用的按钮类控件包括QPushButton、QRadioButton、QCheckBox和QToolButton。这些控件都继承自QAbstractButton因此共享许多核心属性和方法如text、checkable、checked、setIcon、setShortcut等。QPushButton最常用的普通按钮支持图标、快捷键和重复触发setAutoRepeat。QRadioButton单选按钮同一父窗口内默认排他可通过QButtonGroup实现分组排他。QCheckBox复选按钮可同时选中多个支持tristate三态模式。QToolButton主要用于工具栏和菜单场景功能与QPushButton类似。掌握这些按钮控件的属性和信号clicked、pressed、released、toggled是 Qt 界面开发的基础。经典面试题1.QPushButton和QToolButton有什么区别QPushButton是普通的命令按钮常用于对话框和表单中QToolButton通常用于工具栏QToolBar和菜单中外观更紧凑常配合图标使用。两者功能上有很多重叠但应用场景不同。2.QRadioButton默认是排他的如何实现多组单选默认情况下同一父窗口内的所有QRadioButton是互斥的。要实现多组单选需要使用QButtonGroup将按钮分组每组内部排他组与组之间互不影响。3.clicked、pressed、released、toggled这几个信号有什么区别clicked一次完整的点击按下释放后触发。pressed鼠标按下时触发。released鼠标释放时触发。toggled按钮的checked状态改变时触发带bool参数表示当前状态。对于QRadioButtontoggled是最常用的信号。4. 如何给按钮设置快捷键使用setShortcut方法参数为QKeySequence对象。可以直接传入字符串如ctrlc也可以使用预定义常量如Qt::CTRL Qt::Key_C。5.setCheckable(false)和setEnabled(false)有什么区别setCheckable(false)只是禁止按钮被选中但按钮仍然可以响应点击事件setEnabled(false)则彻底禁用按钮既不能选中也不能响应任何输入。
返回列表