Как выдавать сигнал каждый раз, когда строка редактируется в QListWidget? - PullRequest
2 голосов
/ 23 февраля 2012
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);
        }
};

Этот код должен выдавать сигнал каждый раз, когда строка редактируется.

После того, как я вызову " insertItem " в конструкторе, будет выдан сигнал.
Но это все.После этого он никогда не выдается - независимо от того, сколько раз я редактирую строку.

Что мне не хватает?

Ответы [ 3 ]

3 голосов
/ 20 июня 2015

Сначала кажется, что QListWidget :: itemChanged - это путь, но вскоре вы столкнетесь с проблемой: сигнал посылается для всего - вставки, удаления, изменения цвета, флажков и т. Д.! Итак, в конечном итоге вы пытаетесь установить флаги и фильтровать их повсеместно, перехватывая различные сигналы, чтобы выяснить, было ли редактирование фактическим событием. Это становится очень грязным.

Существует также QAbstractItemModel :: dataChanged, который может показаться хорошим решением. Он даже имеет параметр "const QVector & lstRoles", чтобы вы могли сканировать Qt :: EditRole и посмотреть, действительно ли он был отредактирован. Увы, тут есть одна загвоздка - он вызывается для всего, как QListWidget :: itemChanged, и, к сожалению, для QListWidget в любом случае, параметр role всегда пуст при вызове (я пробовал). Вот тебе и идея ...

К счастью, все еще есть надежда ... Это решение делает свое дело! :

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....
}

Теперь у вас есть слот, который вызывается только после редактирования текста элемента списка!

2 голосов
/ 23 февраля 2012

currentRowChanged указывает на строку выбор изменился, а не содержимое строки.Возможно, вы захотите использовать currentTextChanged или itemChanged.

Повторное использование слов current и измененных в документах по QT весьма запутанно.

1 голос
/ 23 февраля 2012

Предупреждение: QListWidgetItem может быть добавлен в QListWidget только один раз. Добавление одного и того же QListWidgetItem несколько раз в QListWidget приведет к неопределенному поведению.

Так что, даже если он будет издавать сигнал, я думаю, вам лучше добавить вновь созданный Предмет. И когда вы хотите вставить новую строку? - как только элемент дважды щелкнет или завершит редактирование - они различаются.

...