【QT源代码复用】模拟QCompleter的弹窗方式
#ifndef LDS_LINEEDIT_COMPLETER_H#define LDS_LINEEDIT_COMPLETER_H#include <QLineEdit>class lds_lineedit_completer_inter;class lds_lineedit_completer : public QLineEdit{Q_OBJECTpublic:explicit lds
·
#ifndef LDS_LINEEDIT_COMPLETER_H
#define LDS_LINEEDIT_COMPLETER_H
#include <QLineEdit>
class lds_lineedit_completer_inter;
class lds_lineedit_completer : public QLineEdit
{
Q_OBJECT
public:
explicit lds_lineedit_completer(QWidget *parent = nullptr);
void setCompleterTop(QWidget *popup);
private:
lds_lineedit_completer_inter *obj;
};
class lds_lineedit_completer_inter : public QObject{
Q_OBJECT
public:
explicit lds_lineedit_completer_inter(QObject *parent = nullptr);
~lds_lineedit_completer_inter();
void setPopup(QWidget *popup, QLineEdit *widget);
protected:
bool eventFilter(QObject *o, QEvent *e);
private:
void showPopup();
private:
QWidget *popup;
QLineEdit *widget;
bool eatFocusOut = false;
};
#endif // LDS_LINEEDIT_COMPLETER_H
#include "lds_lineedit_completer.h"
#include <QEvent>
#include <QKeyEvent>
lds_lineedit_completer::lds_lineedit_completer(QWidget *parent) : QLineEdit(parent)
{
obj = new lds_lineedit_completer_inter(this);
}
void lds_lineedit_completer::setCompleterTop(QWidget *popup)
{
obj->setPopup(popup, this);
}
lds_lineedit_completer_inter::lds_lineedit_completer_inter(QObject *parent)
: QObject(parent)
{
}
lds_lineedit_completer_inter::~lds_lineedit_completer_inter()
{
delete popup;
}
void lds_lineedit_completer_inter::setPopup(QWidget *popup, QLineEdit *widget)
{
this->popup = popup;
this->widget = widget;
widget->installEventFilter(this);
popup->installEventFilter(this);
Qt::FocusPolicy origPolicy = widget->focusPolicy();
popup->setParent(nullptr, Qt::Popup);
popup->setFocusPolicy(Qt::NoFocus);
popup->setFocusProxy(widget);
widget->setFocusPolicy(origPolicy);
}
bool lds_lineedit_completer_inter::eventFilter(QObject *o, QEvent *e)
{
if(eatFocusOut && o == widget && e->type() == QEvent::FocusOut) {
if (popup && popup->isVisible())
return true;
}
switch (e->type()) {
case QEvent::KeyPress :{
QKeyEvent *ke = static_cast<QKeyEvent *>(e);
const int key = ke->key();
switch (key) {
case Qt::Key_End:
case Qt::Key_Home:
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_PageUp:
case Qt::Key_PageDown:
return false;
case Qt::Key_F4:
if (ke->modifiers() & Qt::AltModifier)
popup->hide();
return false;
case Qt::Key_Backtab:
case Qt::Key_Escape:
popup->hide();
return false;
}
if(!popup->isVisible()) {
showPopup();
}
if(o != widget) {
eatFocusOut = false;
(static_cast<QObject *>(widget))->event(ke);
eatFocusOut = true;
}
break;
}
case QEvent::MouseButtonPress: {
if (!popup->underMouse()) {
popup->hide();
}
break;
}
case QEvent::InputMethod:
case QEvent::ShortcutOverride:
// QApplication::sendEvent(widget, e);
return false;
default:
return false;
}
return false;
}
void lds_lineedit_completer_inter::showPopup()
{
popup->move(widget->mapToGlobal(QPoint(0, 0)) - QPoint(0, popup->height()));
popup->show();
}

更多推荐
所有评论(0)