Как открыть всплывающее окно QCompleter при вводе редактирования ячейки в QTableWidget

У меня есть QTableWidget с пользовательским QStyledItemDelegate, и при вводе в редактирование ячейки я хочу открыть всплывающее окно завершения, но оно не появляется.

Настройка делегата:

tableWidget.setItemDelegate(new DelegateLineEdit());

Мой пользовательский класс:

class DelegateLineEdit : public QStyledItemDelegate
{
public:
    DelegateLineEdit() {
        signs << "<" << "<=" << ">" << ">=" << "=";
    }
    ~DelegateLineEdit(){ }
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
        QLineEdit *line_edit = new QLineEdit(parent);
        line_edit->setStyle(parent->style());
        line_edit->setFocusPolicy(Qt::StrongFocus);
        QCompleter *completer = new QCompleter(signs, line_edit);
        completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
        line_edit->setCompleter(completer);
        return line_edit;
    }
    void setEditorData(QWidget *editor, const QModelIndex &index) const {
        QStyledItemDelegate::setEditorData(editor, index);
        QLineEdit *line_edit = dynamic_cast<QLineEdit*>(editor);
        if (line_edit){
            line_edit->completer()->complete();
        }
    }

private:
    QStringList signs;

};

Когда я вхожу в редактирование ячейки двойным щелчком, ничего не происходит, но если я прокомментирую строку
line_edit->completer()->complete(), я могу редактировать ячейку, но завершение не отображается. У кого-нибудь есть идея?


person thibsc    schedule 23.03.2018    source источник
comment
Я бы вообще избавился от setEditorData. Завершитель должен появляться, когда пользователь начинает печатать, никаких дополнительных действий в коде не требуется.   -  person p-a-o-l-o    schedule 23.03.2018
comment
@ p-a-o-l-o, Да, когда вы начинаете печатать, оно всплывает, но я бы хотел, чтобы оно всплывало, когда пользователь вводит редактирование, даже если он еще не начал печатать.   -  person thibsc    schedule 23.03.2018


Ответы (2)


Я бы попробовал использовать подкласс QLineEdit в качестве редактора, где focusInEvent переопределен для отображения всплывающего окна:

class LineEdit : public QLineEdit
{
public:
  explicit LineEdit(QWidget*parent) : QLineEdit(parent){}
protected:
  void focusInEvent(QFocusEvent * e)
  {
    QLineEdit::focusInEvent(e);
    completer()->complete();
  }
};

Делегат становится:

class DelegateLineEdit : public QStyledItemDelegate
{
public:
    DelegateLineEdit() {
        signs << "<" << "<=" << ">" << ">=" << "=";
    }
    ~DelegateLineEdit(){ }
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {

//use the subclass instead of QLineEdit:
        LineEdit *line_edit = new LineEdit(parent);

        line_edit->setStyle(parent->style());
        line_edit->setFocusPolicy(Qt::StrongFocus);
        QCompleter *completer = new QCompleter(signs, line_edit);
        completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
        line_edit->setCompleter(completer);
        return line_edit;
    }

private:
    QStringList signs;

};
person p-a-o-l-o    schedule 23.03.2018
comment
Это работает как шарм, я перегрузил mouseReleaseEvent, но focusIn было достаточно, большое спасибо! - person thibsc; 24.03.2018

Я думаю, что что-то вроде completer->popup()->show(); должно делать то, что вы хотите, или пытаться вызывать как

QCompleter::setCompletionPrefix(index.data(Qt::EditRole).tostring());

а также

QCompleter::complete();
person athar atef    schedule 23.03.2018