2008-10-10 3 views
3

У меня есть несколько комбинированных ящиков и двойных полей для форматирования на моем Qt Dialog. Теперь мне нужно «ResetToDefault» в меню, которое появляется, когда вы нажимаете правой кнопкой мыши на виджет (поле со стрелкой или поле со списком).На виджетах Qt, таких как DoubleSpinBox или ComboBox, как у меня есть пользовательское меню с правом щелчка

Как это получить. Есть ли способ, которым я могу создать собственное меню, которое появляется при щелчке правой кнопкой мыши или есть способ, который я могу добавить в меню, которое появляется при щелчке правой кнопкой мыши.

ответ

5

Во-первых, для 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) и показать его там. Но вам придется протестировать.

+0

спасибо за ввод, если есть контекстное меню, которое уже появляется, я могу добавить к нему элементы? – AMM 2008-10-10 11:31:57

1

Для Qt4 вы можете сделать это для редактируемого QComboBox, используя свой собственный QLineEdit. Создать производный класс QLineEdit который реализует ContextMenuEvent

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

}; 

Затем используйте функцию setLineEdit из QComboBox установить строку ввода

MyLineEdit* edit = new MyLineEdit(); 
comboBox->setLineEdit(edit); 

В поле со списком теперь будет использовать строку редактирования класса. Функция createStandardContextMenu создает обычное контекстное меню, и вы можете добавлять к нему любые новые действия, которые вам нравятся в обработчике contextMenuEvent, прежде чем он будет показан.

Если QComboBox не редактируется, то он не имеет контекстного меню по умолчанию, поэтому использование метода Qt :: ActionsContextMenu намного проще.

QAbstractSpinBox также имеет функцию setLineEdit, поэтому вы можете использовать подобную технику. Хотя по какой-то причине функция setLineEdit защищена на QAbstractSpinBox, но public в QLineEdit.