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ため、せいぜい構成を 2 回変更し、最悪の場合は問題が発生します。returnPressedtriggered

LineEditさらに、 (メニューにはまだありますが、編集可能領域にはありません)の端をクリックすると、メニューはQWidgetActionそれに関連付けられたトリガー信号を発しますが、これは私が望んでいるものではありません。

2 つの質問があります
。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 シグナルを手動で発行し、それをウィジェット階層に渡さないようにすることができます。returnPressed シグナルをメニューの hide() スロットに接続して、アクションをトリガーせずにメニューを閉じるようにしました。

于 2013-08-27T22:55:10.380 に答える