信号点击QSpinBox Qt

时间:2013-04-30 07:58:53

标签: qt events signals qspinbox

我想点击QSpinBox时打开一个窗口。问题是这个小部件没有“点击”这样的信号。

有人知道该怎么做吗?

3 个答案:

答案 0 :(得分:1)

QSpinBox只是一个QLineEdit,有两个按钮,输入验证和事件处理。它没有点击信号,因为它本身应该处理鼠标。

问题在于,即使制作从QSpinBox派生的自定义窗口小部件也不够,因为它本身不接收鼠标事件,它们由子窗口小部件处理。您可以在QSpinBox子项上安装事件过滤器以捕获点击事件,但这不是最好的方法。

如果您只想在用户选择框时显示 numpad ,则可以直接使用QLineEdit。您将丢失QSpinBox按钮(但如果需要,可以添加自己的按钮)和验证(但您可以使用QValidator添加自己的按钮。)

然后你必须派生它才能捕获focus事件,触发一个显示键盘的自定义信号:

class MySpinBox: public QLineEdit
{
  Q_OBJECT

public:
  MySpinBox(QWidget *parent = 0);
  ~MySpinBox();

signals:
  needNumpad(bool hasFocus);

protected:
  virtual void focusInEvent(QFocusEvent *e) {
      QLineEdit::focusInEvent(e);
      emit(needNumpad(true));
  }
  virtual void focusOutEvent(QFocusEvent *e) {
      QLineEdit::focusInEvent(e);
      emit(needNumpad(false));
  }
}

答案 1 :(得分:0)

您可以使用事件过滤器并执行以下操作:

ui->spinBox->installEventFilter(this);
QObjectList o_list = ui->spinBox->children();
for(int i = 0; i < o_list.length(); i++)
{
    QLineEdit *cast = qobject_cast<QLineEdit*>(o_list[i]);
    if(cast)
        cast->installEventFilter(this);
}

在事件过滤器中,您检查鼠标单击(在此示例中,它由所有鼠标按钮触发,左键单击,右键单击,滚动轮单击等。)

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        showNumpadDialog();
    }
    return false;
}

答案 2 :(得分:0)

您无需使用QLineEdit和两个按钮创建自己的QSpinBox。

因为QLineEdit是QSpinBox的孩子。您可以为QLineEdit创建事件过滤器,并检查其父项是否为旋转框。那么,你会得到一个旋转框的点击事件。

   if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()) )