正确收到Qt属性控件中输入框消息
QtPropertyBrowser2.5中的字符串属性对应的修改方式是一个输入框,OnValueChange是在每次键入字符时发送一次.这个对于编辑器需要的逻辑来说是一种灾难. Ogitor修改了其源码,解决了这个问题:
qteditorfactory.h 中
QtLineEditFactory类添加如下代码,红色标识
class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory<QtStringPropertyManager> { Q_OBJECT public: QtLineEditFactory(QObject *parent = 0); ~QtLineEditFactory(); protected: void connectPropertyManager(QtStringPropertyManager *manager); QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property, QWidget *parent); void disconnectPropertyManager(QtStringPropertyManager *manager); private: QtLineEditFactoryPrivate *d_ptr; Q_DECLARE_PRIVATE(QtLineEditFactory) Q_DISABLE_COPY(QtLineEditFactory) Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &)) Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &)) Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &)) Q_PRIVATE_SLOT(d_func(), void slotEditingFinished()) Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) };
qteditorfactory.cpp中
class QtLineEditFactoryPrivate : public EditorFactoryPrivate<QLineEdit> { QtLineEditFactory *q_ptr; Q_DECLARE_PUBLIC(QtLineEditFactory) public: void slotPropertyChanged(QtProperty *property, const QString &value); void slotRegExpChanged(QtProperty *property, const QRegExp ®Exp); void slotSetValue(const QString &value); void slotEditingFinished(); };
void QtLineEditFactoryPrivate::slotEditingFinished() { QObject *object = q_ptr->sender(); const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd(); for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) if (itEditor.key() == object) { QtProperty *property = itEditor.value(); QtStringPropertyManager *manager = q_ptr->propertyManager(property); if (!manager) return; QString value = static_cast<QLineEdit*>(itEditor.key())->text(); manager->setValue(property, value); return; } }
QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager, QtProperty *property, QWidget *parent) { QLineEdit *editor = d_ptr->createEditor(property, parent); QRegExp regExp = manager->regExp(property); if (regExp.isValid()) { QValidator *validator = new QRegExpValidator(regExp, editor); editor->setValidator(validator); } editor->setText(manager->value(property)); connect(editor, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished())); connect(editor, SIGNAL(destroyed(QObject *)), this, SLOT(slotEditorDestroyed(QObject *))); return editor; }
这样既可在输入回车键,或者输入框失去焦点后产生一个OnValueChange事件