2012-02-23 4 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 указывает, что строка выбор изменился, а не содержание строки. Возможно, вы хотите вместо этого использовать currentTextChanged или itemChanged.

Повторное использование слова тока и изменил в документации 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) –