Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gil9red от Июль 04, 2012, 21:44



Название: [РЕШЕНО] Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 04, 2012, 21:44
Здравствуйте!
есть класс, наследующий QWidget, имеющий
переопределенное событие void contextMenuEvent(QContextMenuEvent *event)

есть второй класс, наследующий QTextEdit, и тоже имеет
переопределенное событие void contextMenuEvent(QContextMenuEvent *event)

второй класс имеет родителя - первый

Обобщу: есть окно, оно содержит textEdit, у этого окна есть контекстное меню, но хочется чтобы при вызове контексного меню textEdit, показывалось контекстное меню окна  :)

Как это сделать??

Подскажите пожалуйста!


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: kambala от Июль 04, 2012, 21:48
написать public slot в наследнике QTextEdit и коннектить сигнал к нему как из первого класса, так и из второго


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 04, 2012, 22:00
Я сделал так:
Код:
class myTextEdit: public QTextEdit
{
Q_OBJECT

signals:
    void showContextMenu(QPoint);

protected:
    virtual void contextMenuEvent(QContextMenuEvent *event)
    {
        emit showContextMenu(event->globalPos());
    }

class Widget: public QWidget
{
    Q_OBJECT
public:  
    Widget(QWidget *parent = 0)
    {
  
        connect(&textEdit, SIGNAL(showContextMenu(QPoint)),
                this, SLOT(showContextMenu(QPoint)));
    }

private:
    MyTextEdit textEdit;

private slots:
    void showContextMenu(QPoint point)
    {
        QMenu *menu = new QMenu();
        menu->addAction("Action1");
        menu->addAction("Action2");
        menu->exec(point);
        delete menu;
    }

protected:
    virtual void contextMenuEvent(QContextMenuEvent *event)
    {
        showContextMenu(event->globalPos());
    }
};

Так будет правильно?
По крайней мере этот код работает :)


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: kambala от Июль 04, 2012, 22:14
я имел в виду так:
Код
C++ (Qt)
class MyTextEdit : public QTextEdit
{
   Q_OBJECT
 
public:
   MyTextEdit(QWidget *parent = 0) { connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(showContextMenu(const QPoint &))); }
 
public slots:
   void showContextMenu(const QPoint &p) { ... }
};
 
class Widget: public QWidget
{
   Q_OBJECT
 
public:  
   Widget(QWidget *parent = 0) { connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), textEdit, SLOT(showContextMenu(const QPoint &))); }
 
private:
   MyTextEdit *textEdit; // виджеты всё-таки лучше указателями хранить
};


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 04, 2012, 23:04
Понятно :)


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 04, 2012, 23:08
Спасибо за дельный совет :)


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: Kolobok от Июль 05, 2012, 00:31
Qt::NoContextMenu   the widget does not feature a context menu, context menu handling is deferred to the widget's parent.


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 05, 2012, 18:53
хх, и вправду, работает с такой политикой :)
и никакого лишнего кода :)
спасибо, Kolobok :)


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 08, 2012, 17:33
Не буду создавать новую тему, а спрошу в этой :)

Можно ли, QAction, появляющиеся в контексном меню текстовых редакторов (QTextEdit, QLineEdit), перевести например на русский язык, так чтобы ими можно было пользоваться?

Код:
        
        QMenu *menuTextEdit = textEdit.createStandardContextMenu();

        // получаем указатели

        QAction *actionUndo      = menuTextEdit->actions().at(0);
        QAction *actionRedo      = menuTextEdit->actions().at(1);
        QAction *actionCut        = menuTextEdit->actions().at(3);
        QAction *actionCopy      = menuTextEdit->actions().at(4);
        QAction *actionPaste     = menuTextEdit->actions().at(5);
        QAction *actionSelectAll = menuTextEdit->actions().at(8);

       // в событии контексного меню:

        QMenu *menu = new QMenu();

        menu->addAction(actionCut);
        menu->addAction(actionCopy);
        menu->addAction(actionPaste);
        menu->addSeparator();
        menu->addAction(actionSelectAll);


         // добавляю свои действия
        menu->addSeparator();
        menu->addAction(actionSettings);
        menu->addSeparator();
        menu->addAction(actionHide);
        menu->addAction(actionLock);
        menu->addAction(actionUnlock);
        menu->addAction(actionDelete);
        menu->exec(point);
        delete menu;

если хочется назвать действия подругому, то меняю setText нужного мне QAction,
НО только, когда я добавляю вручную QAction в меню, почти все перестают работать (вставка исключение)

а если получить список QAction, и добавить именно список, то все QAction работают


Название: Re: Общее контекстное меню для нескольких виджетов
Отправлено: gil9red от Июль 08, 2012, 21:05
Похоже придется создавать новую тему..