2012-02-23 41 views
2
class genericTaskList : public QListWidget 
{ 
    Q_OBJECT 
    public: 
     QListWidgetItem *defaultText; 

     genericTaskList (QWidget *parentWidget) 
     { 
      setParent  (parentWidget); 
      setFixedSize (445, 445); 

      defaultText = new QListWidgetItem ("Double click here to compose the task"); 
      defaultText->setFlags (defaultText->flags() | Qt :: ItemIsEditable); 

      insertItem  (0, defaultText); 

      QObject :: connect (this, SIGNAL (currentRowChanged (int)), this, SLOT (addDefaultText (int))); 
     } 

    public slots: 
     void addDefaultText (int rr) 
     { 
      std::cout << "\ndsklfjsdklfhsdklhfkjsdf\n"; 

      insertItem (++rr, defaultText); 
     } 
}; 

该代码应该在每次编辑该行时发出一个信号。如何在每次在QListWidget中编辑行时发出信号?

在构造函数中调用“insertItem”后,发出信号。
但是,就是这样。之后它永远不会被发布 - 无论我多少次编辑该行。

我错过了什么?

回答

3

currentRowChanged指示该行选择发生了变化,该行的不是内容。也许你想用currentTextChangeditemChanged代替。

重复使用字当前改为在QT文档中是相当混乱的。

1

警告:QListWidgetItem只能添加到QListWidget中一次。多次将相同的QListWidgetItem添加到QListWidget中将导致未定义的行为。

所以,即使它会发出信号,我认为你应该更好地添加新创建的项目。 你想要什么时候插入新行? - 只要项目被双击或完成编辑 - 他们不同。

2

起初好像QListWidget :: itemChanged是要走的路,但很快你会遇到一个问题:信号被发送的一切 - 插入,删除,更改颜色,检查框等!那么你最终会试图通过截取各种信号来标记和过滤所有信号,以确定编辑是否是真正的事件。它变得非常混乱。

还有QAbstractItemModel :: dataChanged,这似乎是一个很好的解决方案。它甚至有一个参数“const QVector & lstRoles”,所以你可以扫描Qt :: EditRole并看看它是否真的被编辑过。唉,有一个问题 - 它会像QListWidget :: itemChanged一样被调用,不幸的是,对于QListWidget,无论如何,角色参数在被调用时总是空的(我试过了)。这么多的想法...

幸运的是,仍然有希望......这个解决方案有诀窍! :

http://falsinsoft.blogspot.com/2013/11/qlistwidget-and-item-edit-event.html

他用QAbstractItemDelegate :: closeEditor,但我更喜欢使用QAbstractItemDelegate :: commitData。

所以,做一个连接,像这样......

connect(ui.pLstItems->itemDelegate(), &QAbstractItemDelegate::commitData, this, &MyWidget::OnLstItemsCommitData); 

然后实现这样的插槽...

void MyWidget::OnLstItemsCommitData(QWidget* pLineEdit) 
{ 
     QString strNewText = reinterpret_cast<QLineEdit*>(pLineEdit)->text(); 
    int nRow = ui.pLstItems->currentRow(); 
     // do whatever you need here.... 
} 

现在你有一个被调用,只有当列表项的文字插槽已编辑!

+0

非常感谢。对于那些使用Python进行这种操作的是信号连接语法:myQListWidget.itemDelegate()。commitData.connect(myslot) – 2016-09-27 15:57:08

相关问题