默认属性
属性说明
autoDefault:bool
这个属性决定按钮是否是一个自动默认按钮。
如果这个属性被设置为true则按钮是一个自动默认按钮。
在一些GUI样式中默认按钮会有一个额外的边框在按钮周围,这个边框有3个像素甚至更粗。Qt自动保持这个空白包围在自动默认按钮,也就是说自动默认按钮可能有一个稍微大一点的提示。
对于父对象是QDialog类的按钮,这个属性的默认值为true,其他情况为false。
查看default属性了解default和autoDefault属性如何相互作用的。
default:bool
这个属性决定按钮是否是一个默认按钮。
默认和自动默认按钮决定当用户在对话框中按Enter的时候将会发生什么。
一个按钮的default属性被设置为true(即对话框的默认按钮),那么这个按钮将在用户按下Enter时被触发按下,有个例外:如果一个autoDefault按钮这时有焦点,则这个autoDefault按钮被按下。
当对话框有autoDfault按钮而没有default按钮时,按下Enter将出发当前有焦点的autoDefault按钮,或者如果没有按钮有焦点,则在焦点链中下一个autoDefault按钮被按下。
在对话框中,在同一时刻只能有一个按钮是default按钮。这个按钮当时会显示一个额外的框(依赖于GUI样式)。
default按钮行为仅仅存在于对话框中。在按钮按钮拥有焦点时,总能被键盘的空白键触发。
如果当前默认按钮的default属性被设置为false,而对话框可见,则在下一次对话框中的按钮得到焦点时一个新的default将自动被分配
这个属性默认值为false。
示例
首先,这两个属性的作用有两点:
- 按钮边框高亮
- 空白键(space、enter等键)会自动触发按钮的click信号。
而且第二点只在对话框中才会起作用。所以这两个属性常用在对话框中。
这两个属性在普通窗体中并不直接关联,也就是说setAutoDefault不会对Default属性修改,同样的setDefault也不会对autoDefault修改。
ui->pushButton->setAutoDefault(true); //pushbtn父对象非dialog则默认false,dialog默认为true
qout << ui->pushButton->isDefault() << ui->pushButton->autoDefault();
ui->pushButton->setDefault(true);
qout << ui->pushButton->isDefault() << ui->pushButton->autoDefault();
打印信息
[ ..\dialog.cpp 13 ] false true
[ ..\dialog.cpp 15 ] true true
但是当在对话框中,如果按钮autoDefault属性为true,则在得到焦点时,当前按钮default为true,其他按钮的default为false(也就是说在对话框中,只有一个按钮的default是true)。
为了验证这个属性,我们重新实现keyReleaseEvent。
void Dialog::keyReleaseEvent(QKeyEvent *e)
{
if(e->key() == Qt::Key_Tab){
qout << "btn1 :" << ui->pushButton->isDefault()
<< "btn2 :" << ui->pushButton_2->isDefault()
<< "btn3 :" << ui->pushButton_3->isDefault();
//accept();
}
else{
QDialog::keyPressEvent(e);
}
}
在通过tab键切换焦点后,打印每个按钮的default属性。
[ ..\dialog.cpp 50 ] btn1 : false btn2 : true btn3 : false
[ ..\dialog.cpp 50 ] btn1 : false btn2 : false btn3 : true
[ ..\dialog.cpp 50 ] btn1 : true btn2 : false btn3 : false
会随着焦点的切换,切换default属性的归属。
当我们将三个按钮的autoRepeat属性关闭,则default属性不动。
ui->pushButton->setAutoDefault(false);
ui->pushButton_2->setAutoDefault(false);
ui->pushButton_3->setAutoDefault(false);
ui->pushButton->setDefault(true);
这里我们将btn1的default属性设置为true,因为default默认值为false,如果三个按钮的autodefault设置为false后,效果不明显。此时不论我们如果切换焦点,default打印信息都不变。
[ ..\dialog.cpp 51 ] btn1 : true btn2 : false btn3 : false
[ ..\dialog.cpp 51 ] btn1 : true btn2 : false btn3 : false
[ ..\dialog.cpp 51 ] btn1 : true btn2 : false btn3 : false
为了验证default属性。我们在槽函数中打印信息
void Dialog::on_pushButton_clicked()
{
qout << "this is btn1";
}
然后在界面Btn1按钮属于高亮状态下时
按下enter,在后台打印信息可以看到
[ ..\dialog.cpp 64 ] this is btn1
边框突起
属性说明
flat : bool
这个属性决定按钮边框是否突起。
这个属性默认值是false。如果这个属性被设置,大多数的样式将不绘画按钮背景,除非按钮被按下。setAutoFillBackground可以被用来确保背景被QPalette:Button刷填充。
示例
正常来说按钮会有一个突起的3D效果。也就是flat属性为false(默认值)时。
当使用接口setFlat设置flat属性为true时
ui->pushButton->setFlat(true);
效果如下:
只有当点击按钮时才会突起。
菜单按钮
void QPushButton::setMenu(QMenu *menu)
将菜单menu和这个按钮关联。将按钮转为一个菜单按钮,而在一些样式中这将在按钮文本右侧产生一个小三角形
菜单的所有权不会转移到按钮。
示例
我们先构造一个QMenu并设置一些菜单项,并将这个菜单通过setMenu接口设置到按钮上。
QMenu *menu = new QMenu(ui->pushButton);
menu->addAction("file");
menu->addAction("edit");
menu->addAction("save");
menu->addAction("about");
ui->pushButton->setMenu(menu);
运行后。首先看到按钮右侧有个三角形的符号。点击后会向下显示菜单。