QMenu实现URL记忆功能

单例类记忆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);
}

猜你喜欢

转载自blog.csdn.net/Best_ZYJ/article/details/79101011