QListWidget浮动父窗口之上,可以上下穿越头尾,回车选择选项,设置被选择图标等功能。如下图:
主要代码如下:
#include "form.h"
#include "ui_form.h"
#include <QDebug>
#include <qaction.h>
#include <QKeyEvent>
#include <QUuid>
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
m_listWidget = new QListWidget(this);
//m_listWidget->setParent(this,Qt::ToolTip);
//设置为浮动在父窗口之上。
m_listWidget->setWindowFlags(Qt::ToolTip);
m_listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true4.png"),"Sell1"));
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true2.png"),"NoLock"));
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true4.png"),"Buy1"));
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true4.png"),"Buy2"));
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true4.png"),"Buy3"));
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true4.png"),"Buy4"));
m_listWidget->addItem(new QListWidgetItem(QIcon(":image/images/true4.png"),"Buy5"));
m_listWidget->installEventFilter(this);
m_listWidget->hide();
connect(m_listWidget,SIGNAL(clicked(QModelIndex)),this,
SLOT(OnListWidget_clicked(QModelIndex)));
}
Form::~Form()
{
delete ui;
}
bool Form::eventFilter(QObject *watched, QEvent *e)
{
if(m_listWidget == watched)
{
//失焦隐藏
if(e->type() == QEvent::FocusOut)
{
m_listWidget->hide();
}
if(e->type() == QEvent::KeyPress)
{
QKeyEvent *en = static_cast<QKeyEvent *>(e);
if(en->key() == Qt::Key_Enter || en->key() == Qt::Key_Return)
{
int currRow = m_listWidget->currentIndex().row();
for(int i =0; i < m_listWidget->count(); i++)
{
m_listWidget->item(i)->setIcon(QIcon(":image/images/true4.png"));
}
m_listWidget->item(currRow)->setIcon(QIcon(":image/images/true2.png"));
}
if(en->key() == Qt::Key_Down)
{
int currRow = m_listWidget->currentIndex().row();
int counts = m_listWidget->count();
if(currRow == counts-1)
{
m_listWidget->setCurrentRow(0);
return true;//执行到这return 不能走qlistwidget本身自带的down事件
}
}
if(en->key() == Qt::Key_Up)
{
int currRow = m_listWidget->currentIndex().row();
int counts = m_listWidget->count();
if(currRow == 0)
{
m_listWidget->setCurrentRow(counts-1);
return true;
}
}
}
}
return QWidget::eventFilter(watched,e);
}
void Form::OnListWidget_clicked(const QModelIndex &index)
{
for(int i =0; i < m_listWidget->count(); i++)
{
m_listWidget->item(i)->setIcon(QIcon(":image/images/true4.png"));
}
m_listWidget->item(index.row())->setIcon(QIcon(":image/images/true2.png"));
}
void Form::on_pushButton_clicked()
{
QRect pos = ui->pushButton->geometry();
QPoint point = QWidget::mapToGlobal(QPoint(pos.x(),pos.y()));
m_listWidget->setGeometry(point.x(),point.y()+pos.height()+1,100,140);
m_listWidget->show();
//m_listWidget->item(0)->setSelected(true);
m_listWidget->activateWindow();//设置为活动窗口,否则焦点效果失效
m_listWidget->setFocus();
m_listWidget->setCurrentRow(0);
}