2010-12-17 57 views
6

我正在使用Qt属性浏览器库作为记录编辑器。当用户完成对任何给定字段的编辑时,通过从编辑项目中删除焦点或按下回车键,我希望被通知,以便我可以接受更改,处理它并将其发送到REAL正在改变的项目。QtPropertyBrowser和值更改信号

不幸的是,我似乎只能找到propertyChanged和valueChanged信号,每次添加或删除任何文本时都会触发它们,而不仅仅是当用户触发完成时。

不能得到这个通知我不明白这可以是一个可用的组件。它甚至不会在用户点击[ESC]时恢复,我当然需要实现它!当然,我一定是错了,绝对没有任何信号能够满足我的需求,但我确定无法找到它。

有人知道吗?


考察了源代码,谁做的行编辑器工厂人民作出的不幸的决定与textEdited而非editingFinished连接。这是一个相对简单的事情,除了相当简单的方式使得不可能扩展这个具有可扩展接口的编辑器工厂!

我需要做的就是覆盖createEditor函数,断开坏连接,连接一个更好的连接与中间的调用,以使字符串脱离行编辑控件。但不是!!!我们不会让你这样做!我们将把所有的会计资料放在一个你无法访问或调用的私人课程中,而我们打算让你调用的那些课程将与它们被调用的事实紧密结合编辑控件,而不是其他任何东西。 ERGO,我们已经非常有效地让生活变得像我们想象的那样令人沮丧地不可能。我们不是很棒吗?


我发现了更多。这些类型对象的标准Qt方法使用委托来控制我试图获得的行为。 Qt属性库覆盖了这个行为,并做了其他事情,而不是我想要完成的事情。 QAbstractItemDelegate接口的内部是一个setModelData函数,当用户提交它们的编辑时,该函数被它附加到的视图调用;当它们不提交时销毁编辑器时不会调用它。

下一个技巧是学习Qt模型/视图体系结构并修补库以正确的方式完成它。这甚至可能只不过是简单地删除重写的存根,这会破坏我试图获得的行为。也可能是放弃使用这个系统来代替简单的使用QtTreeView可能是一个更好的选择,尽管它能够保留在不同种类的浏览器之间切换的能力。

+1

5年后,我的感觉和你一样。我做了很多黑客来使属性网格至少有点像.NET一样。 – Jack 2015-11-19 05:09:14

回答

4

所以,这里是我想出了半屁股修复:

我添加了一个“commitItem(QModelIndex)”功能在TreePropertyBrowser私人的事情。然后,当调用setModelData()函数时,我从委托调用它。

然后找到属性,调用一个新的函数,我将其添加到AbstractBrowser中以获取属性的工厂,然后告诉工厂“commitProperty(QtProperty *)”。

这个函数是一个虚拟的基础和在LineEditFactory我重写它应用属性更改,它会生成valueChanged()信号。

有了这些更改后,用户能够通过按ESC键返回到了编辑的,我得到通知当且仅当被敲一下回车,着力改变等提交属性更改......

只有目前适用于树版本。可能不会费心努力让其余的工作。事实上,我可能会把这个库扔掉,只是自己使用QTreeView。 IT以我想要的方式行事,这件事必须被超级黑客攻击以获得行为BACK。

哦,是的,你还必须删除LineEditFactory的createEditor()中textChanged()信号的连接。

1

我之前遇到过这个问题。我们需要知道何时编辑完成任何QVariant编辑器。诀窍是框架在您开始和停止编辑时创建并删除它的小部件。所以,埋在EditorFactory类中,我连接到了QObject :: destroy信号,它创建了每个QWidget类型,并冒出了主应用程序可以捕获的新propertyEditFinished信号。

QtPropertyBrowser绝对是疯狂的,但重新实现整个事情也是一种痛苦。

+0

事实上,我发现重新实施并不是一个很大的工作,而我有一些更有意义的东西。属性浏览器(我想要的部分)只不过是一个基本的树视图。 – 2011-06-15 19:49:34

+0

是的,你是对的。这是关于工程的事情。应该做什么或什么是最简单的总是回到你真正需要做的事上。 :)我们很懒惰是件好事!真高兴你做到了。 – Thadeux 2011-06-16 12:21:01

1

这个问题可能与Qt 5中已经包含QtPropertyBrowser和朋友不再相关。我沿着Thadeaux's approach的路线实施了QtLineEditorFactory的editingFinished信号,然后决定我不需要/想要这样做!也许为了减轻我浪费时间的感觉,我附上我的解决方案的代码差异,以防有人觉得它有用。

Index: src/qteditorfactory.cpp 
    =================================================================== 
    --- src/qteditorfactory.cpp (revision 737) 
    +++ src/qteditorfactory.cpp (working copy) 
    @@ -1076,7 +1076,6 @@ 
    } 


    - 
    /*! 
     \class QtLineEditFactory 

    @@ -1094,7 +1093,6 @@ 
    { 
     d_ptr = new QtLineEditFactoryPrivate(); 
     d_ptr->q_ptr = this; 
    - 
    } 

    /*! 
    @@ -1121,6 +1119,10 @@ 
       this, SLOT(slotEchoModeChanged(QtProperty *, int))); 
     connect(manager, SIGNAL(readOnlyChanged(QtProperty*, bool)), 
      this, SLOT(slotReadOnlyChanged(QtProperty *, bool))); 
    + 
    + // c.s. Added 4/12/2017 
    + connect(this, SIGNAL(propertyEditingFinished(QtProperty*, const QString&)), 
    +  manager, SIGNAL(propertyEditingFinished(QtProperty*, const QString&))); 
    } 

    /*! 
    @@ -1131,7 +1133,6 @@ 
    QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager, 
      QtProperty *property, QWidget *parent) 
    { 
    - 
     QLineEdit *editor = d_ptr->createEditor(property, parent); 
     editor->setEchoMode((EchoMode)manager->echoMode(property)); 
     editor->setReadOnly(manager->isReadOnly(property)); 
    @@ -1146,9 +1147,49 @@ 
        this, SLOT(slotSetValue(const QString &))); 
     connect(editor, SIGNAL(destroyed(QObject *)), 
        this, SLOT(slotEditorDestroyed(QObject *))); 
    - return editor; 
    + 
    + // c.s. Added 4/12/2017 
    + connect(editor, SIGNAL(editingFinished()), SLOT(handleEditingFinished())); 
    + return editor; 
    } 

    + 
    + 
    +// c.s. Added 4/12/2017 
    +void QtLineEditFactory::handleEditingFinished() 
    +{ 
    + auto keys = d_ptr->m_editorToProperty.keys(); 
    + QLineEdit *le = qobject_cast<QLineEdit*>(sender()); 
    + if (!le) 
    +  return; 
    + 
    + disconnect(le, SIGNAL(editingFinished()), this, SLOT(handleEditingFinished())); 
    + 
    + QtProperty *property = 0; 
    + 
    + const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = 
    +  d_ptr->m_editorToProperty.constEnd(); 
    + for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = 
    +   d_ptr->m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) 
    + { 
    +  if (itEditor.key() == le) 
    +  { 
    +   property = itEditor.value(); 
    +   if (!property) 
    +    return; 
    +   
    +   QtStringPropertyManager *manager = propertyManager(property); 
    + 
    +   if (!manager) 
    +    return; 
    + 
    +   QString s = manager->value(property); 
    +   manager->setValue(property, s); // make sure it has the last value 
    +   emit propertyEditingFinished(property, s); 
    +  } 
    + } 
    +} 
    + 
    /*! 
     \internal 

    @@ -1165,6 +1206,9 @@ 
     disconnect(manager, SIGNAL(readOnlyChanged(QtProperty*, bool)), 
      this, SLOT(slotReadOnlyChanged(QtProperty *, bool))); 

    + // c.s. Added 4/12/2017 
    + disconnect(this, SIGNAL(propertyEditingFinished(QtProperty*, const QString&)), 
    +  manager, SIGNAL(propertyEditingFinished(QtProperty*, const QString&))); 
    } 

    // QtDateEditFactory 
    Index: src/qteditorfactory.h 
    =================================================================== 
    --- src/qteditorfactory.h (revision 737) 
    +++ src/qteditorfactory.h (working copy) 
    @@ -183,6 +183,14 @@ 
     QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property, 
        QWidget *parent); 
     void disconnectPropertyManager(QtStringPropertyManager *manager); 
    + 
    +// c.s. Added 4/12/2017 
    +Q_SIGNALS: 
    + void propertyEditingFinished(QtProperty*, const QString&); // signal editing done in line_editor is finished 
    + 
    +protected slots: 
    + void handleEditingFinished(); // similar to QLineEdit 
    + 
    private: 
     QtLineEditFactoryPrivate *d_ptr; 
     Q_DECLARE_PRIVATE(QtLineEditFactory) 
    Index: src/qtpropertymanager.h 
    =================================================================== 
    --- src/qtpropertymanager.h (revision 737) 
    +++ src/qtpropertymanager.h (working copy) 
    @@ -200,6 +200,9 @@ 
     void echoModeChanged(QtProperty *property, const int); 
     void readOnlyChanged(QtProperty *property, bool); 

    + // c.s. Added 4/12/2017 
    + void propertyEditingFinished(QtProperty *, const QString &val); 
    + 
    protected: 
     QString valueText(const QtProperty *property) const; 
     QString displayText(const QtProperty *property) const;