我想在单击 时打开一个窗口QSpinBox
。问题是这个小部件没有“点击”这样的信号。
有人知道怎么做吗?
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));
}
}
您可以使用事件过滤器并执行以下操作:
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;
}
您不需要使用 QLineEdit 和两个按钮创建自己的 QSpinBox。
由于 QLineEdit 是 QSpinBox 的孩子。您可以为 QLineEdit 创建一个事件过滤器并检查其父级是否为旋转框。那么,你会得到一个旋转框的点击事件。
if(event->type() == QEvent::MouseButtonPress && dynamic_cast<QSpinBox *>(dynamic_cast<QLineEdit *>(obj)->parent()) )