我希望在弹出的菜单中有一个行编辑字段。我基本上是让用户选择几种常见尺寸之一,但我希望他们能够输入自定义尺寸作为菜单中的最后一个条目。
所以我有这样的东西(从更大的代码剪下来,new_menu是感兴趣的菜单):
QWidget *widget = new QWidget(new_menu);
QHBoxLayout *layout = new QHBoxLayout;
QLineEdit* le = new QLineEdit;
le->setPlaceholderText("Custom");
le->setFixedWidth(100);
ayout->addWidget(le);
widget->setLayout(layout);
QWidgetAction* wa = new QWidgetAction(new_menu);
wa->setActionGroup(group);
wa->setDefaultWidget(widget);
new_menu->addAction(wa);
connect(le, SIGNAL(returnPressed()), this, SLOT(leslot()));
哪个效果很好,LineEdit
显示在菜单中很好并且居中,它有占位符文本,我可以点击它并编辑所有内容。但是,当我在textBox
上按Enter键时,它会发出returnPressed
信号,菜单会发出triggered
信号,其中包含列表中的其他操作之一,所以我最好改变我的配置两次,最坏的情况是破坏。
此外,当我点击LineEdit
的边缘时(尽管仍然在菜单中,但不在可编辑区域中),菜单会发出一个与QWidgetAction
相关联的触发信号,这不是我想要的。
所以有两个问题:
1)我可以按照自己想要的方式返回工作岗位吗?菜单在点击时关闭会很好,但它也不会发出另一个动作
2)点击lineEdit
后,我可以让它完全不发出动作吗?
答案 0 :(得分:2)
这就是我最后为后来的人做的事情。我因此将QLineEdit子类化:
class EnterLineEdit : public QLineEdit {
Q_OBJECT
public:
void keyPressEvent(QKeyEvent *evt) {
if (evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return) {
emit returnPressed();
} else {
QLineEdit::keyPressEvent(evt);
}
}
};
这使我可以在命中输入/返回时手动发出returnPressed信号,并且不将其传递给窗口小部件层次结构,因此当输入击中lineedit时,菜单永远不会看到它。我将returnPressed信号连接到菜单的hide()插槽,以便菜单仍然关闭,但不会触发操作。