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事件