可編輯的QLabel主要是用於某些填字遊戲,例如數獨,具體的實現是通過在QStackedWidget切換QLabel和QLineEdit來實現的,代碼也非常的簡單,具體怎麼用還需要自己添加新的內容
QEditLabel.h
#pragma once
#include <QStackedWidget>
#include <QLabel>
#include <QLineEdit>
#include <QEvent>
#include <QObject>
class QEditLabel : public QWidget {
Q_OBJECT
public:
QEditLabel(QWidget *parent = Q_NULLPTR);
protected:
bool eventFilter(QObject * obj, QEvent * e);
private:
QStackedWidget * m_stackWidget;
QLabel * m_label;
QLineEdit * m_lineEdit;
private:
void initCtrls(void);
};
QEditLabel.cpp
#include "QEditLabel.h"
QEditLabel::QEditLabel(QWidget *parent)
: QWidget(parent) {
initCtrls();
}
bool QEditLabel::eventFilter(QObject * obj, QEvent * e) {
if (obj == m_label) {
if (QEvent::FocusIn == e->type()) {
m_stackWidget->setCurrentWidget(m_lineEdit);
}
}
else if(obj == m_lineEdit) {
if (QEvent::FocusOut == e->type()) {
m_stackWidget->setCurrentWidget(m_label);
}
}
return QWidget::eventFilter(obj, e);
}
void QEditLabel::initCtrls(void) {
m_stackWidget = new QStackedWidget(this);
m_label = new QLabel("test");
m_label->setStyleSheet("background-color:white");
m_lineEdit = new QLineEdit();
m_label->setFocusPolicy(Qt::FocusPolicy::ClickFocus);
m_stackWidget->setGeometry(0, 0, 50, 50);
m_label->installEventFilter(this);
m_lineEdit->installEventFilter(this);
m_stackWidget->addWidget(m_label);
m_stackWidget->addWidget(m_lineEdit);
m_stackWidget->setCurrentWidget(m_label);
}