На виджетах Qt, таких как DoubleSpinBox или ComboBox, как мне сделать пользовательское меню правой кнопки мыши? - PullRequest
3 голосов
/ 10 октября 2008

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

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

Ответы [ 2 ]

5 голосов
/ 10 октября 2008

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

1 голос
/ 10 октября 2008

Для 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, но общедоступна в QLineEdit.

...