Как открыть 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()Я могу отредактировать ячейку, но пока нет завершения. У кого-нибудь есть идея?

1

Решение

Я бы попробовал использовать 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;

};
1

Другие решения

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

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

а также

QCompleter::complete();
0

По вопросам рекламы [email protected]