ZBLOG

E:\7_qt_dir\untitled3\main.cpp:31: error: 'virtual void QLabel::mousePressEvent(QMouseEvent*)' is protected within this context connect(label, &QLabel::mousePressEvent, this, &EditableLabel::editContent); ...

这个错误是因为 QLabel::mousePressEvent 是一个受保护的成员函数,不能直接连接到信号。要解决这个问题,可以使用 QWidget::installEventFilter 或者通过重写 QLabel 来处理鼠标事件。

下面是使用事件过滤器的方法:

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QString>
#include <QMouseEvent>

class EditableLabel : public QWidget {
    Q_OBJECT

public:
    EditableLabel(QWidget *parent = nullptr) : QWidget(parent) {
        layout = new QVBoxLayout(this);
        label = new QLabel();
        lineEdit = new QLineEdit();

        // 原始字符串
        QString originalString = "qqqqqqqqqq(111111111111)qqqqqq(ddd)qqq";

        // 删除括号及其内部内容
        modifiedString = originalString;
        modifiedString.remove(QRegExp("\\(.*?\\)"));

        // 设置 QLabel 的初始文本
        label->setText(modifiedString);
        
		// 隐藏 QLineEdit 初始状态下	
		lineEdit->hide();
		
		layout->addWidget(label);
		layout->addWidget(lineEdit);

		// 安装事件过滤器以捕获点击事件
		label->installEventFilter(this); 

        connect(lineEdit, &QLineEdit::editingFinished, this, &EditableLabel::updateContent);
    }

protected:
    bool eventFilter(QObject *obj, QEvent *event) override {
        if (obj == label && event->type() == QEvent::MouseButtonPress) {
            editContent();
            return true; // 事件已处理
        }
        return QWidget::eventFilter(obj, event); // 交给父类处理其他事件
    }

private slots:
    void editContent() {
        label->hide();   // 隐藏 QLabel 
        lineEdit->show(); // 显示 QLineEdit 
		lineEdit->setText(""); // 清空输入框以便用户编辑		
		lineEdit->setFocus();  // 将光标移动到 QLineEdit 中,方便输入		
    }

    void updateContent() {
	    modifiedString += "(" + lineEdit->text() + ")"; // 添加括号内内容
	    label->setText(modifiedString); // 更新标签文本	    
	    lineEdit->hide();   // 隐藏输入框
	    label->show();      // 显示标签	
    }

private:
    QVBoxLayout *layout;
    QLabel *label;
    QLineEdit *lineEdit;
    QString modifiedString;
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    EditableLabel window;
    window.show();

    return a.exec();
}

#include "main.moc"

解释:

  1. 使用 eventFilter:我们在 EditableLabel 类中重写了 eventFilter() 方法,用于捕获鼠标点击事件。
  2. 隐藏与显示控件:在点击 label 时,将其隐藏,并显示一个 line edit 控件进行编辑。在编辑完成后,更新标签的内容并重新隐藏输入框。

这样,你就可以实现一个包含可编辑部分的效果,而不需要直接修改 QLabel 的行为。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21486

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?