QListWidget Editable Item сигнал при изменении текста - PullRequest
0 голосов
/ 02 декабря 2018

В Qt 4.6.1, когда я подключаю сигнал itemChanged из QListWidget, я не вижу поведения непрерывного излучения при каждом редактировании, как описано в

Qt - сигнал, когда строка QListWidget имеет значениеотредактировано?

Для меня он выдает itemChanged только после нажатия «Enter», так же, как решение commitData.

QListWidget* Groups = new QListWidget();  
Groups->setEditTriggers(QAbstractItemView::AllEditTriggers);    
connect(Groups,SIGNAL(itemChanged(QListWidgetItem*)),this,SLOT(slot_itemchanged(QListWidgetItem*)));
connect(Groups->itemDelegate(), SIGNAL(commitData(QWidget*)), this, SLOT(slot_dataCommited(QWidget*)));
Groups->insertItem(0,"search");
Groups->item(0)->setFlags(Groups->item(0)->flags() | Qt::ItemIsEditable);

Как заставить его генерировать сигнал при каждом изменении / нажатии клавиши во время редактирования элемента (0), чтобы я мог реализовать функцию автозаполнения типа?

1 Ответ

0 голосов
/ 02 декабря 2018

Задача автозаполнения должна быть выполнена в редакторе через делегата:

#include <QtWidgets>

class CompleteDelegate: public QStyledItemDelegate
{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index);
        if(QLineEdit *le = qobject_cast<QLineEdit *>(editor)){
            QStringList wordList{"alpha", "omega", "omicron", "zeta"};
            QCompleter *completer = new QCompleter(wordList, le);
            //completer->setCompletionMode(QCompleter::InlineCompletion);
            le->setCompleter(completer);
        }
        return editor;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QListWidget w;
    CompleteDelegate *delegate = new CompleteDelegate(&w);
    w.setItemDelegate(delegate);
    w.setEditTriggers(QAbstractItemView::AllEditTriggers);
    for(const QString & text: {"search", "find"}){
        QListWidgetItem *it = new QListWidgetItem(text);
        it->setFlags(it->flags()| Qt::ItemIsEditable);
        w.addItem(it);
    }
    w.show();
    return a.exec();
}
...