[英]How to capture signal from Q(double)spinbox
我正在通過Qt 4.7編寫一個小型應用程序。 我在某些QSpinBoxes和QDoubleSpinBoxes中經常遇到問題。 我設置了editingFinished()信號,並且當我在這些字段中的任何一個字段上更改值時,它們都會發送兩個信號:當旋轉框失去焦點時和按下enter鍵時。 因此,當我按下選項卡或輸入按鈕時,我的程序將進行兩次計算。 有什么聰明又簡單的方法可以只設置lostFocus信號?
PS我是Qt的新手。 對不起,我的英語,我還在學習。
編輯:
非常感謝您對netrom的幫助!
但這還是有問題的...應該看起來像下面嗎? 我可以編譯並運行它,但是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
您可以嘗試檢查Spinbox小部件在插槽的開頭是否具有焦點,它應該告訴您editingFinished()
信號是Enter / Return鍵還是失去焦點的結果。
void Dialog::on_spinBox_editingFinished() {
if(ui->spinBox->hasFocus())
return;
// rest of your code
}
您可以覆蓋keyPressEvent(QKeyEvent*)
並在按下Enter鍵時忽略該事件。 另一種方法是重寫focusOutEvent(QFocusEvent*)
但要確保setFocusPolicy()
設置為Qt::NoFocus
以外的其他Qt::NoFocus
。
這是第一種方法的示例:您從QSpinBox繼承並重寫keyPressEvent()
方法,並使其忽略Enter /返回鍵:
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()
信號,該信號僅在失去焦點時才會顯示(例如,使用鼠標或Tab鍵)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.