Qt - 右键单击时编辑按钮文本

Qt - Edit button text on right click

本文关键字:编辑按 按钮 文本 编辑 右键 单击 Qt      更新时间:2023-10-16

我想创建一个按钮,当用户右键单击按钮时,会出现一个上下文菜单,为用户提供替换按钮上文本的选项。 当用户选择替换选项时,他们可以编辑按钮本身上的文本标签。

我右键单击以创建上下文菜单,并且可以拦截键事件以更改标签,但是当我这样做时,我必须为自己处理所有各种键盘功能,例如删除。

我想知道是否有更好的方法来做到这一点。有没有办法在按钮上放置QLineEdit来编辑按钮文本?

这是我开始的代码。

EventButton::EventButton(QWidget *parent) : 
QPushButton(parent) 
{ }
void EventButton::mousePressEvent(QMouseEvent *e) {
if (e->button() == Qt::RightButton) {
QMenu contextMenu;
contextMenu.addAction("Replace Text", this, [=] {
this->grabKeyboard();
this->setText("");
});
QPoint globalPos = mapToGlobal(e->pos());
contextMenu.exec(globalPos);
} else {
emit clicked();
}
}
void EventButton::keyPressEvent(QKeyEvent *e) {
// Check for return key
if ((e->key() == Qt::Key_Enter) || (e->key() == Qt::Key_Return)) {
this->releaseKeyboard();
emit buttonTitleChanged(this->text());
} else {
QString text = this->text();
text.append(e->key());
this->setText(text);
}
}

您只需向按钮添加一个QLineEdit子项即可。我还会给按钮一个网格布局,以自动处理行编辑定位和调整大小,并覆盖contextMenuEvent以显示菜单,最终得到这样的结果:

#include <QPushButton>
#include <QMenu>
#include <QAction>
#include <QContextMenuEvent>
#include <QGridLayout>
class EventButton : public QPushButton
{
Q_OBJECT
QLineEdit * lineEdit;
public:
explicit EventButton(const QString &text, QWidget *parent) :
QPushButton(text, parent)
{
lineEdit = new QLineEdit();
lineEdit->setAlignment(Qt::AlignCenter | Qt::AlignHCenter);
lineEdit->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
connect(lineEdit, &QLineEdit::editingFinished, [=](){
setText(lineEdit->text());
lineEdit->hide();
});
QGridLayout * gridlayout = new QGridLayout();
gridlayout->setMargin(0);
setLayout(gridlayout);
gridlayout->addWidget(lineEdit);
lineEdit->hide();
}
protected:
void contextMenuEvent(QContextMenuEvent *event) override
{
QMenu contextMenu;
contextMenu.addAction("Replace Text", this, [=] {
QString text = this->text();
lineEdit->setText(text);
lineEdit->setSelection(0, text.size());
lineEdit->show();
lineEdit->setFocus();
});
QPoint globalPos = mapToGlobal(event->pos());
contextMenu.exec(globalPos);
}
};