我正在通过Qt 4.7编写迷你应用程序。我有一些QSpinBoxes和QDoubleSpinBoxes的重复出现的问题。我设置了editingFinished()信号,当我更改任何这些字段中的值时,它们会发送两个信号:当旋转框失去焦点并按下输入时。因此,当我按下选项卡或输入按钮时,我的程序会进行两次计算。是否有任何智能且简单的方法来设置lostFocus信号?
P.S。 我是Qt的新手。抱歉我的英语,我还在学习。
编辑:
非常感谢你的帮助!
但它仍然是错误的...它应该在下面吗?我可以编译并运行,但似乎SpinBox仍然对Enter按钮做出反应。
dialog.h:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QSpinBox>
#include <QKeyEvent>
namespace Ui {
class SpinBox;
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
private slots:
void on_spinBox_editingFinished();
};
class SpinBox : public QSpinBox
{
Q_OBJECT
public:
explicit SpinBox(QWidget *parent = 0) : QSpinBox(parent) { }
protected:
void keyPressEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_Return:
case Qt::Key_Enter:
return;
default: break;
}
QSpinBox::keyPressEvent(event);
}
};
#endif // DIALOG_H
答案 0 :(得分:1)
你可以尝试检查一下旋转框小部件是否在插槽的开头有焦点,它应该告诉你editingFinished()
信号是否是输入/返回键的结果或失去焦点。
void Dialog::on_spinBox_editingFinished() {
if(ui->spinBox->hasFocus())
return;
// rest of your code
}
答案 1 :(得分:0)
您可以覆盖keyPressEvent(QKeyEvent*)
并在按下Enter时忽略该事件。另一种方法是覆盖focusOutEvent(QFocusEvent*)
,但要确保将setFocusPolicy()
设置为Qt::NoFocus
之外的其他内容。
以下是第一种方法的示例:您从QSpinBox继承并覆盖keyPressEvent()
方法并使其忽略输入/返回键:
class SpinBox : public QSpinBox {
Q_OBJECT
public:
SpinBox(QWidget *parent = NULL) : QSpinBox(parent) { }
protected:
void keyPressEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_Return:
case Qt::Key_Enter:
return;
default: break;
}
QSpinBox::keyPressEvent(event);
}
};
现在只使用editingFinished()
信号,该信号仅在焦点丢失时给出(例如,使用鼠标或制表键)。