单例类记忆URL:
头文件:
QQueue<QString> m_urlQueue;
void AddQueueItem(const QString &string);
QQueue<QString> getQueueInfo();
源文件:
void GlobalData::AddQueueItem(const QString &string) {
if (string.length() < 5) {
return;
}
if (m_urlQueue.size() >= 5) {//最多记忆5条
m_urlQueue.dequeue();
}
for (int i = 0; i < m_urlQueue.size(); i++) {
if (m_urlQueue.at(i) == string) {
return;
}
}
m_urlQueue.enqueue(string);
}
QQueue<QString> GlobalData::getQueueInfo() {
return m_urlQueue;
}
显示对话框:
头文件:
UrlLineEdit *m_urlEdt;
MyTrayMenu *m_urlMenu;
QWidget *contentUrlWidget[5];
QLabel *contentUrlLabel[5];
QWidgetAction *contentAction[5];
QQueue<QString> m_tmpQueue;
int m_lastSame;
public slots:
void onShowMenu();
void onHideMenu();
void onChangeUrlMenu(QAction *action);
void onTextChanged(const QString &string);
源文件:
构造函数:
QShortcut *enterAct = new QShortcut(Qt::Key_Return, m_urlEdt);
connect(enterAct, SIGNAL(activated()), this, SLOT(onGoButton()));
m_urlMenu = new MyTrayMenu();
m_urlMenu->setObjectName("urlMenu");
m_urlMenu->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); //必须设置为此,否则有问题
m_urlMenu->hide();
connect(m_urlMenu, SIGNAL(triggered(QAction *)), this, SLOT(onChangeUrlMenu(QAction *)));
connect(m_urlEdt, SIGNAL(focusInSig()), this, SLOT(onShowMenu()));
connect(m_urlEdt, SIGNAL(focusOutSig()), this, SLOT(onHideMenu()));
connect(m_urlEdt, SIGNAL(textChanged(const QString &)), this, SLOT(onTextChanged(const QString &)));
m_lastSame = 0;
其它接口:
void ZTabWidget::onShowMenu() {
m_tmpQueue.clear();
m_tmpQueue = GlobalData::getInstance()->getQueueInfo();
if (m_tmpQueue.size() <= 0) {
return;
}
if (m_urlMenu->isVisible()) {
return;
}
m_urlMenu->clear();
int sameCount = 0;
for (int i = 0; i < m_tmpQueue.size(); i++) {
QString currentTxt = m_urlEdt->text();
if (m_tmpQueue.at(i).contains(currentTxt)) {
contentUrlWidget[i] = new QWidget();
contentUrlWidget[i]->setFixedHeight(20);
contentUrlWidget[i]->setObjectName("contentUrlWidget");
contentUrlLabel[i] = new QLabel(m_tmpQueue.at(i));
contentUrlLabel[i]->setObjectName("contentUrlLabel");
contentUrlLabel[i]->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
QHBoxLayout *layout = new QHBoxLayout();
layout->setContentsMargins(5, 2, 0, 2);
layout->addWidget(contentUrlLabel[i]);
contentUrlWidget[i]->setLayout(layout);
contentAction[i] = new QWidgetAction(m_urlMenu);
contentAction[i]->setDefaultWidget(contentUrlWidget[i]);
contentAction[i]->setObjectName("contentAction");
m_urlMenu->addAction(contentAction[i]);
sameCount++;
}
}
if (sameCount > 0) {
m_urlMenu->setFixedWidth(m_urlEdt->width());
QPoint point = m_urlEdt->mapToGlobal(QPoint(0,0));
m_urlMenu->move(point.x(), point.y()+20);
m_urlMenu->show();
}
}
void ZTabWidget::onHideMenu() {
m_urlMenu->hide();
}
void ZTabWidget::onChangeUrlMenu(QAction *action) {
int index = -1;
for (int i = 0; i < m_tmpQueue.size(); i++) {
if (contentAction[i] == action) {
index = i;
}
}
m_urlEdt->setText(m_tmpQueue.at(index));
onGoButton();
}
void ZTabWidget::onTextChanged(const QString &string) {
int sameCount = 0;
for (int i = 0; i < m_tmpQueue.size(); i++) {
if (m_tmpQueue.at(i).contains(string.toLower())) {
sameCount++;
}
}
if (sameCount != m_lastSame) {
m_lastSame = sameCount;
m_urlMenu->hide();
onShowMenu();
}
}
其它文件:
文件1.h
#ifndef MYTRAYMENU_H
#define MYTRAYMENU_H
#include <QLabel>
#include <QPushButton>
#include <QMenu>
class MyTrayMenu:public QMenu
{
Q_OBJECT
public:
explicit MyTrayMenu(QWidget *parent = 0);
~MyTrayMenu(){}
signals:
void leaveAction();
protected:
void leaveEvent(QEvent *event);
};
#endif
文件1.cpp
#include "MyTrayMenu.h"
#include <QEvent>
MyTrayMenu::MyTrayMenu(QWidget *parent)
:QMenu(parent)
{
this->installEventFilter(this);
}
void MyTrayMenu::leaveEvent(QEvent *event) {
this->hide();
emit leaveAction();
QMenu::leaveEvent(event);
}
#ifndef URLLINEEDIT_H
#define URLLINEEDIT_H
#include <QLineEdit>
#include <QLabel>
文件2.h
class UrlLineEdit : public QLineEdit
{
Q_OBJECT
public:
UrlLineEdit(QWidget *parent = 0);
~UrlLineEdit();
signals:
void focusInSig();
void focusOutSig();
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void focusOutEvent(QFocusEvent *e);
virtual void mousePressEvent(QMouseEvent *event);
};
#endif
文件2.cpp
#include "UrlLineEdit.h"
#include <QFocusEvent>
UrlLineEdit::UrlLineEdit(QWidget *parent)
:QLineEdit(parent)
{
}
UrlLineEdit::~UrlLineEdit()
{
}
void UrlLineEdit::focusInEvent(QFocusEvent *e)
{
if (e->gotFocus() && e->reason() == Qt::MouseFocusReason) {
emit focusInSig();
}
QLineEdit::focusInEvent(e);
}
void UrlLineEdit::focusOutEvent(QFocusEvent *e)
{
if (e->lostFocus() && e->reason() == Qt::MouseFocusReason) {
emit focusOutSig();
}
QLineEdit::focusOutEvent(e);
}
void UrlLineEdit::mousePressEvent(QMouseEvent *event) {
emit focusInSig();
QLineEdit::mousePressEvent(event);
}