
Если элемент из m_box выбирается методом сопоставления поиска с помощью клавиш вверх и вниз и клавиши Enter, курсор также не будет отображаться в m_box, как показано в примере ниже.

Однако, если совпадающие элементы отображаются через при совпадении поиска и выборе элемента из раскрывающегося списка с помощью мыши курсор будет отображаться в m_box, как показано в примере ниже.

Я надеюсь на единообразное поведение всех трех методов: до тех пор, пока выбранный элемент существует в элементах-кандидатах m_box, курсор не должен отображаться в m_box, если только не щелкнуть мышью по m_box, после чего курсор должен появиться. Вот минимальный воспроизводимый пример:
#include
#include
#include
#include
#include
#include
#include
#include
class CustomDialog : public QDialog
{
Q_OBJECT
public:
CustomDialog(QWidget* parent = nullptr) : QDialog(parent)
{
QStringList items;
items addItems(items);
QCompleter* completer = new QCompleter(items, m_box);
completer->setFilterMode(Qt::MatchContains);
m_box->setCompleter(completer);
m_lst = new QListWidget(this);
m_lst->addItems(items);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_box);
layout->addWidget(m_lst);
connect(m_box, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
}
public slots:
void onSelChangedBox(int iSel);
private:
QComboBox* m_box;
QListWidget* m_lst;
};
void CustomDialog::onSelChangedBox(int iSel)
{
qDebug() setFocus();
}
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
CustomDialog dlg;
dlg.setFixedSize(300, 200);
dlg.show();
return a.exec();
}
#include "main.moc"
Примечание. Если добавлен второй QComboBox и элемент выбран с использованием третьего метода, то щелчок по второму QComboBox приведет к появлению двух курсоров. Фактически, в этот момент фокус больше не находится на первом QComboBox, но курсор все еще отображается. Код и пример следующие:

#include
#include
#include
#include
#include
#include
#include
#include
class CustomDialog : public QDialog
{
Q_OBJECT
public:
CustomDialog(QWidget* parent = nullptr) : QDialog(parent)
{
QStringList items;
items addItems(items);
QCompleter* completer1 = new QCompleter(items, m_box1);
completer1->setFilterMode(Qt::MatchContains);
m_box1->setCompleter(completer1);
m_box2 = new QComboBox(this);
m_box2->setEditable(true);
m_box2->addItems(items);
QCompleter* completer2 = new QCompleter(items, m_box2);
completer2->setFilterMode(Qt::MatchContains);
m_box2->setCompleter(completer2);
m_lst = new QListWidget(this);
m_lst->addItems(items);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_box1);
layout->addWidget(m_box2);
layout->addWidget(m_lst);
connect(m_box1, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
connect(m_box2, SIGNAL(activated(int)), this, SLOT(onSelChangedBox(int)));
}
public slots:
void onSelChangedBox(int iSel);
private:
QComboBox* m_box1;
QComboBox* m_box2;
QListWidget* m_lst;
};
void CustomDialog::onSelChangedBox(int iSel)
{
qDebug() setFocus();
}
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
CustomDialog dlg;
dlg.setFixedSize(500, 500);
dlg.show();
return a.exec();
}
#include "main.moc"
Подробнее здесь: https://stackoverflow.com/questions/790 ... ox-using-d
Мобильная версия