【问题标题】:How to turn off QAbstractButton animateClick when lineEdit has focuslineEdit有焦点时如何关闭QAbstractButton animateClick
【发布时间】:2014-07-29 14:11:04
【问题描述】:

我是 QT GUI 编程的新手,我正在使用 QT Creator。我看到的问题是当用户按下回车键时我的按钮和行编辑。我的程序打开一个组框并允许用户输入密码并按确定或取消。

如果用户在行编辑获得焦点时按下回车键,程序似乎会为 QAbstractButton animateClick(); 发出第二个信号,因此当下一个组框打开并提示用户按确定或取消时,程序继续就好像用户按下了确定按钮一样。

我将我的 Push 按钮设置为允许用户按 Tab 键并按 Enter 键。为了获得这个功能,我设置了 okbutton->setAutodefault(true); 和 cancelButton->setAutodefault(true);

我还有一个 lineEdit 供用户输入密码并按 Enter。我通过将按下的返回信号连接到如下所示的 ok 按钮来进行设置。

connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));

我也尝试直接将return press信号连接到插槽,但问题仍然存在。

connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(chkPassword()));

如果用户用鼠标单击 okButton 或我设置 okButton->setAutoDefault(false); 程序会正常运行。我想知道是否可以禁用在行编辑具有焦点时发生的 animateClick 信号。

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: c++ qt qlineedit qpushbutton qabstractbutton


    【解决方案1】:

    尽量不要将lineEditokButton 连接起来,即在代码中注释掉这一行:

    connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));
    

    并检查程序的行为是否符合您的要求。


    另外,你可能想打电话

    okButton->setDefault(true);
    

    除了您在两个按钮上的setAutoDefault() 调用之外,这取决于您在用户按下 Enter 并关注各种焦点时究竟想要发生什么。有关此主题的更多信息,请参阅this answer


    我假设,因为您从未提及它,您不会为任何按钮调用setDefault()。因此,okButton 是您将autoDefault 属性设置为true 的第一个按钮。这意味着只要对话框必须处理在其他一些autoDefault 按钮上没有发生的 Enter 按键(例如您的情况下的cancelButton),okButton 就会成为对话框的“选择按钮” )。

    每当对话框中的任何小部件收到 Enter 按键并且不使用事件本身时,该事件最终由对话框的默认按钮处理逻辑处理,从而导致单击前面提到的“选择按钮”。

    QLineEdit 不用于多行编辑,因此它可能只是不消耗 Enter 的按键事件(同时仍在处理它,因为它发送了 returnPressed()信号)。因此,returnPressed() 的连接最终会做它正在做的任何事情,并且,另外,默认按钮逻辑最终会再次单击您的按钮。

    还可以查看this thread on the Qt project forums,它似乎以不同的方式解决了相同的问题。

    【讨论】:

    • 感谢您的回复。我设置了 okbutton->setDefault(true) 并更改了 connect(lineEdit, SIGNAL(returnPressed()), okButton, SIGNAL(clicked()));连接(lineEdit, SIGNAL(returnPressed()), this, SLOT(chkPassword()));
    • 我希望用户能够使用选项卡切换到 lineedit、okbutton 或 cancel 按钮,然后按 enter 执行所需的功能。如果我理解正确,我相信我需要为 QLineEdit 创建一个事件过滤器来处理 returnPressed() 而不是上面的 connect 语句。虽然我还是 qt 的新手,并且不确定如何为行编辑设置事件过滤器以仅处理 returnPressed 信号,并且不允许默认按钮逻辑也处理它。您可以提供的任何建议将不胜感激。谢谢。
    • @Ivory244 不要更改connect(),而是完全删除它。只要您的okButton 设置为默认值,在焦点为QLineEdit 的情况下按Enter 应该与单击OK 具有相同的效果,因为lineEdit 只会忽略按键并将其交给其父小部件进行处理,这应该会激活默认按钮。
    • @Ivory244 很高兴我能帮上忙 :) Qt 在某些方面相当棘手,但有很好的文档记录,并且通常很高兴使用它。如果它解决了您的问题,请接受我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多