在开发的过程中,我们可能会遇到搜索框联想的功能。但是怎么联想,且联想下拉框的qss样式怎么设置,和下拉框中是否可以放入自己的控件等问题。
废话不多说,直接上代码。
头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets>
class ULineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit ULineEdit(QWidget *parent = 0);
~ULineEdit();
QToolButton *btnSearchIcon(); //搜索按钮
QToolButton *btnInputCleanIcon(); //清除按钮
private slots:
void slotcompleter(QString str);
// void sloteditchange(QString text);
private:
QCompleter *m_MyInfor;
QToolButton *m_btnSearchIcon;
QToolButton *m_btnInputCleanIcon;
QPushButton *m_btn;
};
#endif // MAINWINDOW_H
cpp文件:
#include "ulineedit.h"
#include <QCompleter>
//联想下拉框四边间距
#define ITEM_LEFT_MARGIN 10
#define ITEM_RIGHT_MARGIN 10
#define ITEM_TOP_MARGIN 20
#define ITEM_BOTTOM_MARGIN 20
ULineEdit::ULineEdit(QWidget *parent) :
QLineEdit(parent)
{
//使输入框具有初始化提示语句
this->setPlaceholderText( "搜索" );
this->setFixedSize(200,24);
this->setWindowFlag(Qt::FramelessWindowHint);
this->move(300,300);
//布局设置搜索按钮
m_btnSearchIcon = new QToolButton(this);
m_btnSearchIcon->setFixedSize(24,24);
m_btnSearchIcon->setIcon(QIcon("/home/yjd/searchdrop/搜索.png"));
m_btnSearchIcon->setIconSize(QSize(24,24));
//布局设置清除按钮
m_btnInputCleanIcon = new QToolButton(this);
m_btnInputCleanIcon->setFixedSize(16,16);
m_btnInputCleanIcon->setIcon(QIcon("/home/yjd/searchdrop/删除.png"));
QHBoxLayout* layout = new QHBoxLayout;
layout->addWidget(m_btnSearchIcon);
layout->addSpacing(this->width()-m_btnSearchIcon->width()-m_btnInputCleanIcon->width());
layout->addWidget(m_btnInputCleanIcon);
layout->setContentsMargins(0,0,0,0);
this->setLayout(layout);
//设置起始输入位置
this->setTextMargins(m_btnSearchIcon->width(), 0, m_btnInputCleanIcon->width(), 0);
//设置输入联想下拉框
QStringList word_list;
word_list<< "1"<<"12"<<"213"<<"123"<<"231"<<"321"<<"Java" << "C++" << "C#" << "PHP" << "Perl" << "Python" << "Delphi" << "Ruby" ;
m_MyInfor = new QCompleter (word_list);
m_MyInfor->setFilterMode(Qt::MatchContains);
m_MyInfor->setCaseSensitivity(Qt::CaseInsensitive);
//创建想下拉框自定义widget
QWidget* w = new QWidget;
// w->setStyleSheet("background:black"); //测试代码
w->setFixedSize(this->width()-ITEM_LEFT_MARGIN-ITEM_RIGHT_MARGIN,m_MyInfor->popup()->height());
m_MyInfor->popup()->setViewport(w);
QAbstractItemView *popup = m_MyInfor->popup();
connect(m_MyInfor,SIGNAL(activated(QString)),this,SLOT(slotcompleter(QString)));
// connect(this,SIGNAL(textChanged(QString)),this,SLOT(sloteditchange(QString)));
//设置联想下拉框代理,这个关乎qss的是否生效
QStyledItemDelegate* d = new QStyledItemDelegate(this);
popup->setItemDelegate(d);
popup->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//设置联想下拉框样式
QString stylestr = QString("QAbstractItemView::item:selected{background:blue;height:20px;border-radius:5px;}"
"QAbstractItemView::item{color:white;background:red;min-height:30px;border-radius:5px;border-bottom:1px solid #DDDDDD;margin-bottom:%1px;/*边缘间隔*/}"
"QAbstractItemView{background:rgb(81, 81, 81);outline:none;border-radius:10px;padding-left:%2px;padding-right:%3px;padding-top:%4px;/*拓展距离*/}")
.arg(ITEM_BOTTOM_MARGIN).arg(ITEM_LEFT_MARGIN).arg(ITEM_RIGHT_MARGIN).arg(ITEM_TOP_MARGIN);
popup->setStyleSheet(stylestr);
//设置Eidt的模糊查询对象
this->setCompleter(m_MyInfor);
}
ULineEdit::~ULineEdit()
{
}
//返回搜索按钮,给其他类自定义设置
QToolButton* ULineEdit::btnSearchIcon()
{
return m_btnSearchIcon;
}
//返回清除按钮,给其他类自定义设置
QToolButton* ULineEdit::btnInputCleanIcon()
{
return m_btnInputCleanIcon;
}
//记录选择的联想内容
void ULineEdit::slotcompleter(QString str)
{
qDebug()<<str<<m_MyInfor->completionCount();
}
//动态调整联想下拉框,下拉框存在自定义btn时可以使用该调整。
//void ULineEdit::sloteditchange(QString text)
//{
// m_MyInfor->popup()->setFixedHeight(m_MyInfor->completionCount()*50+ITEM_LEFT_MARGIN+ITEM_RIGHT_MARGIN);
//}