C++ 如何释放QPushButton(QDialog的默认按钮)的焦点?
我有一个QDialog,它有一个QPushButton和一个QLineEdit。QPushButton设置为默认按钮。当我运行对话框并单击Enter键时,会单击QPushButton并调用相应的插槽,这是预期的行为。但当我使用鼠标单击QLineEdit,然后再次单击Enter键时,也会调用QPushButton的clicked槽。如何预防?我想在其他小部件上单击Enter按钮,什么也不做。当我使用Tab键浏览小部件时,QPushButton总是粗体(突出显示),我想这就是为什么每次按下Enter键时都会调用它的原因。您必须将按钮的自动默认值设置为falseC++ 如何释放QPushButton(QDialog的默认按钮)的焦点?,c++,qt,C++,Qt,我有一个QDialog,它有一个QPushButton和一个QLineEdit。QPushButton设置为默认按钮。当我运行对话框并单击Enter键时,会单击QPushButton并调用相应的插槽,这是预期的行为。但当我使用鼠标单击QLineEdit,然后再次单击Enter键时,也会调用QPushButton的clicked槽。如何预防?我想在其他小部件上单击Enter按钮,什么也不做。当我使用Tab键浏览小部件时,QPushButton总是粗体(突出显示),我想这就是为什么每次按下Enter
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上输入按键调用了该插槽。这正是我想要的。谢谢你的回复。听起来你不想要默认的按钮行为。顺便提一下:您还可以使用事件过滤器,而不是对所有内容进行子类化: