可编辑的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);
}