1

我想在我的弹出菜单中有一个行编辑字段。我基本上是让用户从几种常见尺寸中选择一种,但我希望他们能够输入自定义尺寸作为菜单中的最后一个条目。

所以我有这样的东西(从较大的代码中截取,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显示很好,在菜单中居中,它有占位符文本,我可以点击它并编辑,一切。但是,当我在 上按 Enter 键时textBox,它会发出returnPressed信号,并且菜单会发出triggered带有列表中其他操作之一的信号,所以充其量我要更改我的配置两次,最坏的情况是事情会中断。

此外,当我单击边缘LineEdit(尽管仍在菜单中,但不在可编辑区域中)时,菜单会发出QWidgetAction与其相关联的触发信号,这不是我想要的。

所以有两个问题:
1)我能以我想要的方式获得回报吗?如果菜单在被点击时关闭,那很好,但它也不能发出另一个动作。
2)我可以让它在lineEdit单击时根本不发出动作吗?

4

1 回答 1

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);
        }        
    }
};

这让我可以在按下 enter/return 时手动发出 returnPressed 信号,而不是将其向上传递到小部件层次结构,因此当在 lineedit 上按下 enter 时菜单永远不会看到它。我将 returnPressed 信号连接到菜单的 hide() 槽,这样菜单仍然会关闭,但不会触发操作。

于 2013-08-27T22:55:10.380 回答