Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何释放QPushButton(QDialog的默认按钮)的焦点?_C++_Qt - Fatal编程技术网

C++ 如何释放QPushButton(QDialog的默认按钮)的焦点?

C++ 如何释放QPushButton(QDialog的默认按钮)的焦点?,c++,qt,C++,Qt,我有一个QDialog,它有一个QPushButton和一个QLineEdit。QPushButton设置为默认按钮。当我运行对话框并单击Enter键时,会单击QPushButton并调用相应的插槽,这是预期的行为。但当我使用鼠标单击QLineEdit,然后再次单击Enter键时,也会调用QPushButton的clicked槽。如何预防?我想在其他小部件上单击Enter按钮,什么也不做。当我使用Tab键浏览小部件时,QPushButton总是粗体(突出显示),我想这就是为什么每次按下Enter

我有一个QDialog,它有一个QPushButton和一个QLineEdit。QPushButton设置为默认按钮。当我运行对话框并单击Enter键时,会单击QPushButton并调用相应的插槽,这是预期的行为。但当我使用鼠标单击QLineEdit,然后再次单击Enter键时,也会调用QPushButton的clicked槽。如何预防?我想在其他小部件上单击Enter按钮,什么也不做。当我使用Tab键浏览小部件时,QPushButton总是粗体(突出显示),我想这就是为什么每次按下Enter键时都会调用它的原因。

您必须将按钮的自动默认值设置为false

void setAutoDefault(bool)
见:

如果对话框中有更多按钮,则还必须将其自动默认值设置为false。否则,这些按钮将获得焦点并在按下enter键时执行。

这并不(直接)取决于焦点:当小部件不处理事件时,它将转发给小部件的父级。QLineEdit不处理enter,因此它会将其发送到QDialog,QDialog会激活enter上的默认按钮。默认按钮以特殊方式显示,例如样式上的粗体边框

您可以编写自己的QLineEdit子类,以防止Enter事件传播:

#include <QtWidgets>

class MyLineEdit : public QLineEdit
{
public:
    MyLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) {}

protected:
    void keyPressEvent(QKeyEvent *event) {
        if (event->key() == Qt::Key_Return) {
            event->accept(); // I have handled the event, don't propagate
        } else {
            QLineEdit::keyPressEvent(event);
        }
    }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QDialog d;
    QLineEdit *l = new MyLineEdit(&d);
    QPushButton *b = new QPushButton("Ok", &d);
    b->setDefault(true);
    QHBoxLayout *h = new QHBoxLayout(&d);
    h->addWidget(l, 1);
    h->addWidget(b);

    QObject::connect(b, &QPushButton::clicked, [&]{QMessageBox::information(&d, "OK", "OK");});

    d.show();
    return app.exec();
}
#包括
类MyLineEdit:公共QLineEdit
{
公众:
MyLineEdit(QWidget*parent=nullptr):QLineEdit(parent){}
受保护的:
无效按键事件(QKeyEvent*事件){
if(event->key()==Qt::key\u Return){
event->accept();//我已处理该事件,不传播
}否则{
QLineEdit::按键事件(事件);
}
}
};
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
QDialog d;
QLineEdit*l=新的MyLineEdit(&d);
QPushButton*b=新的QPushButton(“确定”和d);
b->setDefault(true);
QHBoxLayout*h=新的QHBoxLayout(&d);
h->addWidget(l,1);
h->addWidget(b);
连接(b,&QPushButton::clicked,[&]{QMessageBox::information(&d,“确定”,“确定”);});
d、 show();
返回app.exec();
}

如果我使用此方法,我必须为QDialog中的每个小部件创建自己的类,QPushButton除外。因为我希望其他小部件都忽略Enter键。我所做的是,我使用QDialog上的KeyPress事件忽略回车键。它忽略QDialog中每个小部件(包括QPushButton)上的Enter键。但由于我已经为QPushButtons clicked signal编写了插槽,所以在QPushButton上输入按键调用了该插槽。这正是我想要的。谢谢你的回复。听起来你不想要默认的按钮行为。顺便提一下:您还可以使用事件过滤器,而不是对所有内容进行子类化: