【问题标题】:Signal click on QSpinBox Qt信号点击 QSpinBox Qt
【发布时间】:2013-04-24 01:59:40
【问题描述】:

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

有人知道怎么做吗?

【问题讨论】:

  • 为什么要打开一个窗口而不是让用户更改旋转框的值? QSpinBox 没有 clicked 信号,因为他们应该自己处理它。听起来您需要一个自定义小部件。
  • 这是一个触觉应用程序,所以当用户点击 spinBow 时,我想打开一个小键盘应用程序让他输入数字
  • 如果你不使用QSpinBox按钮,为什么不使用简单的QLineEdit呢?

标签: qt events signals qspinbox


【解决方案1】:

QSpinBox 只是带​​有两个按钮的QLineEdit,输入验证和事件处理。它没有 clicked 信号,因为它甚至应该自己处理鼠标。

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

如果你只想在用户选择框时显示一个数字键盘,你可以直接使用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));
  }
}

【讨论】:

    【解决方案2】:

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

    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;
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 2018-06-01
        • 2020-02-07
        • 1970-01-01
        • 2020-05-22
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多