Qt - 右键单击时编辑按钮文本
Qt - Edit button text on right click
我想创建一个按钮,当用户右键单击按钮时,会出现一个上下文菜单,为用户提供替换按钮上文本的选项。 当用户选择替换选项时,他们可以编辑按钮本身上的文本标签。
我右键单击以创建上下文菜单,并且可以拦截键事件以更改标签,但是当我这样做时,我必须为自己处理所有各种键盘功能,例如删除。
我想知道是否有更好的方法来做到这一点。有没有办法在按钮上放置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);
}
};
相关文章:
- 函数计算用户按下按钮的频率
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- SDL 操纵杆按钮按下/C++
- 按钮按下打开 OLED ESP32
- C++ SFML 仅在按下按钮时应用
- 按下时将图像添加到按钮
- 只需按一次按钮即可通过USB发送数据
- 尝试在按下此按钮时去抖动
- QTool按钮按Alt后显示菜单
- QT-如何通过按下按钮从子窗口小部件返回到父窗口小部件
- wxWidget按下了哪个按钮(wxButton)
- 按下Arduino按钮后,如何在C#应用程序上执行操作
- 来自行编辑的 Qt 值和来自 QCheckBox 的检查值无法按预期工作
- Qt按钮按下增量
- Qt - 右键单击时编辑按钮文本
- QT - 检测按下了哪个按钮
- 由按钮按按钮创建的QOBject
- 自动按按钮
- 如何在不按按钮的情况下调用函数