Qt 控件 实现 QComboBox输入自动提示功能(仿Google搜索提示)

本文介绍了一个使用Qt的QComboxTest类实现的组合框与列表组件示例。该示例通过QLineEdit和QListWidget展示了如何根据输入过滤并显示匹配的城市名称列表。此外,还实现了键盘上下键导航及Enter键选择的功能。
部署运行你感兴趣的模型镜像


1 运行效果界面:




2  控件介绍: 一个QLineEdit   一个QListWidget


3  代码实现:


#ifndef QCOMBOXTEST_H
#define QCOMBOXTEST_H

#include <QtGui/QMainWindow>
#include "ui_qcomboxtest.h"
#include <vector>

using namespace std;


class QComboxTest : public QMainWindow
{
	Q_OBJECT

public:
	QComboxTest(QWidget *parent = 0, Qt::WFlags flags = 0);
	~QComboxTest();
	
	private Q_SLOTS:

		void OnRadarChange(const QString &strText);
		//pr
protected:
	void keyPressEvent ( QKeyEvent * e ) ;

private:
	Ui::QComboxTestClass ui;
	vector<QString> vtCity;
};

#endif // QCOMBOXTEST_H

#include "qcomboxtest.h"

#include "richCombox.h"
#include <vector>
#include <QLayout>
#include <QListWidget>
#include <QKeyEvent>

using namespace std;


QComboxTest::QComboxTest(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	connect(ui.lineEdit,SIGNAL(textChanged (const QString & )),this,SLOT(OnRadarChange(const QString & )));
	//connect(ui.comboBox,SIGNAL(editTextChanged (const QString & )),this,SLOT(OnRadarChange(const QString & )));
	//disconnect(ui.comboBox->view(),0,0,0);

	vtCity.push_back("beijing1");
	vtCity.push_back("beijing2");
	vtCity.push_back("beijing3");
	vtCity.push_back("beijing4");
	vtCity.push_back("beijing5");
	vtCity.push_back("beijing6");
	vtCity.push_back("beijing7");
	vtCity.push_back("beijing8");
	vtCity.push_back("beijing9");
	vtCity.push_back("bengbu");
	vtCity.push_back("baise");
	vtCity.push_back("hailaer");
	//ui.comboBox->setStyleSheet("QComboBox::drop-down{""border-style: none;}");
	//ui.lineEdit->setFocusPolicy(Qt::NoFocus);
	//ui.comboBox->lineEdit()->setFocusPolicy(Qt::NoFocus);;
	//ui.comboBox->view()->setFocusPolicy(Qt::NoFocus);;
	
	QListWidget *pWidget = new QListWidget();
	pWidget->addItem("123");
	pWidget->addItem("123");
	pWidget->addItem("123");
	pWidget->addItem("123");
	ui.listWidget->setVisible(false);
	//ui.comboBox->setView(pWidget);
	//RichComboBox *ptestBox = new RichComboBox();
	//ui.comboBox->layout()->addWidget(ptestBox);
	//ptestBox->addItem("hailaer");

}

QComboxTest::~QComboxTest()
{

}

void QComboxTest::keyPressEvent ( QKeyEvent * keyevent ) 
{
	
	
	if(QApplication::focusWidget() != ui.lineEdit || ui.listWidget->count() == 0)return;
	int uKey = keyevent->key();
	Qt::Key key = static_cast<Qt::Key>(uKey);
	int iIndex = ui.listWidget->currentRow ();
	if(key == Qt::Key_Up)
	{
		iIndex--;
		if(iIndex < 0) iIndex = 0;
		QListWidgetItem *pItem = ui.listWidget->item(iIndex);
		pItem->setForeground(Qt::red);
		ui.listWidget->setCurrentItem(pItem);
		
	}
	else if (key == Qt::Key_Down)
	{
		iIndex++;
		if(iIndex >= ui.listWidget->count()) iIndex = ui.listWidget->count() - 1;
		QListWidgetItem *pItem = ui.listWidget->item(iIndex);
		ui.listWidget->setCurrentItem(pItem);
	}
	else if (key == Qt::Key_Enter || key == Qt::Key_Return)
	{
		ui.lineEdit->setText(ui.listWidget->currentItem()->text());
	}
}

void QComboxTest::OnRadarChange(const QString &strText)
{
	//disconnect(ui.comboBox,SIGNAL(editTextChanged (const QString & )),this,SLOT(OnRadarChange(const QString & )));
	ui.listWidget->clear();
	for(int i = 0;i < vtCity.size();++i){

		if (vtCity[i].indexOf(strText) != -1)
		{
			
			ui.listWidget->addItem(vtCity[i]);
		}
	}
	if (ui.listWidget->count() > 0)
	{
		ui.listWidget->setVisible(true);
	}
	//connect(ui.comboBox,SIGNAL(editTextChanged (const QString & )),this,SLOT(OnRadarChange(const QString & )));
}


                   具体代码,

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值