带有QLinEedit动作的Qt菜单

时间:2013-08-27 21:34:21

标签: qt

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

所以我有这样的东西(从更大的代码剪下来,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后,我可以让它完全不发出动作吗?

1 个答案:

答案 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()插槽,以便菜单仍然关闭,但不会触发操作。