Qt ダイアログにいくつかのコンボ ボックスとダブル スピン ボックスがあります。ここで、ウィジェット (スピン ボックスまたはコンボ ボックス) を右クリックすると表示されるメニューに "ResetToDefault" 項目が必要です。
どうすれば入手できますか。右クリックで表示されるカスタム メニューを作成する方法はありますか、または右クリックで表示されるメニューに項目を追加する方法はありますか。
Qt ダイアログにいくつかのコンボ ボックスとダブル スピン ボックスがあります。ここで、ウィジェット (スピン ボックスまたはコンボ ボックス) を右クリックすると表示されるメニューに "ResetToDefault" 項目が必要です。
どうすれば入手できますか。右クリックで表示されるカスタム メニューを作成する方法はありますか、または右クリックで表示されるメニューに項目を追加する方法はありますか。
まず、Qt4 の場合、データをリセットするアクションを作成し、addAction
メソッドを使用して (またはデザイナーを使用して) ウィジェットに追加するのが最も簡単な方法です。次に、contextMenuPolicy
属性をに設定しますQt::ActionsContextMenu
。コンテキスト メニューが表示され、アクションがトリガーされます。
コード例:
QAction *reset_act = new QAction("Reset to default");
mywidget->addAction(reset_act);
mywidget->setContextMenuPolicy(Qt::ActionsContextMenu);
// here connect the 'triggered' signal to some slot
Qt3 の場合、コンテキスト メニュー イベントをインターセプトする必要がある場合があるため、QSpinBox などを継承します。QWidget::childAt
または、メイン ウィンドウからコンテキスト メニュー イベントをインターセプトし、(メソッドを使用して) コンテキスト メニューがあるはずのウィジェットの上でイベントが発生したかどうかを検出し、そこに表示することもできます。しかし、あなたはテストする必要があります。
Qt4 では、独自の QLineEdit を使用して、編集可能な QComboBox に対してこれを行うことができます。contextMenuEvent を実装する派生 QLineEdit クラスを作成します
class MyLineEdit : public QLineEdit
{
Q_OBJECT
public:
MyLineEdit(QWidget* parent = 0) : QLineEdit(parent){}
void contextMenuEvent(QContextMenuEvent *event)
{
QPointer<QMenu> menu = createStandardContextMenu();
//add your actions here
menu->exec(event->globalPos());
delete menu;
}
};
次に、QComboBox の setLineEdit 関数を使用して行編集を設定します。
MyLineEdit* edit = new MyLineEdit();
comboBox->setLineEdit(edit);
コンボ ボックスは行編集クラスを使用するようになりました。createStandardContextMenu 関数は通常のコンテキスト メニューを作成し、それが表示される前に contextMenuEvent ハンドラで任意の新しいアクションを追加できます。
QComboBox が編集可能でない場合、デフォルトのコンテキスト メニューがないため、Qt::ActionsContextMenu メソッドを使用する方がはるかに簡単です。
QAbstractSpinBox にも setLineEdit 関数があるため、同様の手法を使用できます。ただし、何らかの理由で setLineEdit 関数は QAbstractSpinBox では保護されていますが、QLineEdit では公開されています。