1

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

有人知道怎么做吗?

4

3 回答 3

3

AQSpinBox只是QLineEdit具有两个按钮,输入验证和事件处理。它没有点击信号,因为它甚至应该自己处理鼠标。

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

如果您只想在用户选择框时显示一个小键盘,您可以直接使用QLineEdit. 您将丢失QSpinBox按钮(但如果需要,您可以添加自己的按钮)和验证(但您可以添加自己的 using 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));
  }
}
于 2013-04-30T08:28:30.527 回答
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;
}
于 2013-04-30T11:17:46.630 回答
0

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

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

   if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()) )
于 2015-03-17T12:59:32.690 回答