2010-12-17 56 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;