Qt5中创建一个自动筛选补全的QCombobox

xiaoxiao2021-02-28  46

1、需要用到的类有:QComboBox、QLineEdit、QCompleter、QSortFilterProxyModel、QStandardItemModel、QStandardItem,添加相关引用 2、前提:QComboBox设置为可编辑,即setEditable(true); 3、原理: A、单列数据(即只对QComboBox显示的数据自动补全):给QComboBox添加一个自动完成类对象(QCompleter),其数据与QComboBox相同(也可以不同),QComboBox输入文字变化时,QCompleter自动筛选过滤,并给出待选列表,通过鼠标或上下键可以选择相关选项,完成编辑。 B、多列数据(对QComboBox显示的数据之外,也可对其他隐藏列自动补全,比如增加一列拼音):比单列数据时,多增加一个中间层QSortFilterProxyModel来对多列数据进行筛选,QCompleter数据使用QSortFilterProxyModel。

4、示例代码:

A、单列数据

QComboBox *m_ComboBox=new QComboBox(this); QStandardItemModel *model=new QStandardItemModel(this); //源数据 QList<QStandardItem *> row; QStandardItem *blankitem=new QStandardItem(""); model->appendRow(blankitem); //增加一行空白 QStringList list=getList(); //获取数据函数 foreach (QStringList name, list) { if(!name.isEmpty()){ row.clear(); QStandardItem *item=new QStandardItem(name); model->appendRow(item); //添加一行,2列数据 } } m_ComboBox->setModel(model); //QComboBox设置数据源 QCompleter *completer=new QCompleter(m_ComboBox); completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setModel(model); completer->setCompletionColumn(m_ComboBox->modelColumn()); completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); completer->setMaxVisibleItems(10); //下拉最大高度 completer->popup()->setStyleSheet("QListView{font:75 12pt \"微软雅黑\";subcontrol-origin: padding;subcontrol-position: top right;width: 20px;}"); //设置弹出的补全列表样式 m_ComboBox->setCompleter(completer); //设置自动补全 m_ComboBox->setStyleSheet("QComboBox{combobox-popup: 0;}"); //linux系统上,防止下拉框过长 m_ComboBox->setMaxVisibleItems(10); //下拉最大高度 B、 多列数据

QComboBox *m_ComboBox=new QComboBox(this); QStandardItemModel *model=new QStandardItemModel(this); //源数据 QList<QStandardItem *> row; QStandardItem *blankitem=new QStandardItem(""); QStandardItem *blankitem1=new QStandardItem(""); row<<blankitem<<blankitem1; model->appendRow(row); //增加一行空白 QStringList list=getList(); //获取数据函数 foreach (QStringList name, list) { if(!name.isEmpty()){ row.clear(); QStandardItem *item=new QStandardItem(name); QString chars=Chinese2PinYin::getFirstPYChars(name); //获取中文拼音首字母 QStandardItem *item1=new QStandardItem(chars); row<<item<<item1; model->appendRow(row); //添加一行,2列数据 } } m_ComboBox->setModel(model); //QComboBox设置数据源 QSortFilterProxyModel *proxy = new QSortFilterProxyModel(m_ComboBox); proxy->setSourceModel(model); proxy->setFilterCaseSensitivity(Qt::CaseInsensitive); proxy->setFilterKeyColumn(-1); //-1表示匹配所有列 QCompleter *completer=new QCompleter(m_ComboBox); completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setModel(proxy); completer->setCompletionColumn(m_ComboBox->modelColumn()); completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); completer->setMaxVisibleItems(10); //下拉最大高度 completer->popup()->setStyleSheet("QListView{font:75 12pt \"微软雅黑\";subcontrol-origin: padding;subcontrol-position: top right;width: 20px;}"); //设置弹出的补全列表样式 m_ComboBox->setCompleter(completer); //设置自动补全 m_ComboBox->setStyleSheet("QComboBox{combobox-popup: 0;}"); m_ComboBox->setMaxVisibleItems(10); //下拉最大高度 connect(m_ComboBox->lineEdit(),SIGNAL(textEdited(QString)),proxy,SLOT(setFilterFixedString(QString))); //连接QComboxBox的编辑框文字变化信号到QSortFilterProxyModel设置过滤字符槽 //connect(m_ComboBox,SIGNAL(editTextChanged(QString)),proxy,SLOT(setFilterFixedString(QString))); //错误写法,这样写的话,会导致无法用上下键选择相关选项

转载请注明原文地址: https://www.6miu.com/read-84293.html

最新回复(0)