Qt之QPushButton属性验证

默认属性

属性说明

 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。

示例

首先,这两个属性的作用有两点:

  1. 按钮边框高亮
  2. 空白键(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按钮属于高亮状态下时

Qt之QPushButton属性验证

按下enter,在后台打印信息可以看到

[ ..\dialog.cpp 64 ] this is btn1

边框突起

属性说明

flat : bool

这个属性决定按钮边框是否突起。

这个属性默认值是false。如果这个属性被设置,大多数的样式将不绘画按钮背景,除非按钮被按下。setAutoFillBackground可以被用来确保背景被QPalette:Button刷填充。

示例

正常来说按钮会有一个突起的3D效果。也就是flat属性为false(默认值)时。

当使用接口setFlat设置flat属性为true时

ui->pushButton->setFlat(true);

效果如下:

Qt之QPushButton属性验证

只有当点击按钮时才会突起。


菜单按钮

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);

运行后。首先看到按钮右侧有个三角形的符号。点击后会向下显示菜单。

更多参考:

Qt之QPushButton

Qt之QAbstractButton

Qt之QPushButton属性验证Qt之QPushButton属性验证 小黑屋1024 发布了36 篇原创文章 · 获赞 13 · 访问量 1万+ 私信 关注
上一篇:python – PyQt:从QDesigner和Connect按钮包装对话框


下一篇:Qt C++自定义信号------一例双窗口案例