我自定义了一个对话框,其中包含一个 QComboBox 控件
m_box
和一个 QListWidget 控件 m_lst
。 m_box
支持搜索匹配。如果直接用鼠标点击选择m_box
的下拉列表中的一项,则m_box
中不会显示光标,如下例所示。
如果使用上下键加回车键的搜索匹配方式选择
m_box
中的项目,m_box
中也不会显示光标,如下例所示。
但是,如果通过搜索匹配显示匹配的项目,并用鼠标从下拉列表中选择项目,则光标将显示在
m_box
中,如下例所示。
我希望所有三种方法的行为一致:只要所选项目存在于
m_box
的候选项目中,光标就不应该显示在m_box
中,除非鼠标单击m_box
,此时光标应该出现。这是一个最小的可重现示例:
#include <QApplication>
#include <QDialog>
#include <QComboBox>
#include <QListWidget>
#include <QCompleter>
#include <QStringList>
#include <QVBoxLayout>
#include <QDebug>
class CustomDialog : public QDialog
{
Q_OBJECT
public:
CustomDialog(QWidget* parent = nullptr) : QDialog(parent)
{
QStringList items;
items << "item1" << "item2";
m_box = new QComboBox(this);
m_box->setEditable(true);
m_box->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() << "clear focus of m_box";
m_lst->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"
我认为这可以通过将完成器的
activated
信号之一连接到你的槽函数来实现。然而,这些仅适用于 QModelIndex
或 QString
参数,因此有多种选择。
如果您不需要索引值,您可以将其从槽函数中删除,以使其与任何信号兼容。否则,您可以使用函数指针语法,如文档中所述:
connect(completer, QOverload<const QModelIndex &>::of(&QCompleter::activated),
[=](const QModelIndex &index){ onSelChangedBox(index.row()); });
当然,它与另一个成员函数一起工作也一样好。
请注意,我自己还没有实际测试过这一点;请告诉我它是否有效。