我想点击QSpinBox
时打开一个窗口。问题是这个小部件没有“点击”这样的信号。
有人知道该怎么做吗?
答案 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()) )