Russian Qt Forum
Ноябрь 27, 2024, 18:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Общее контекстное меню для нескольких виджетов  (Прочитано 6256 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Июль 04, 2012, 21:44 »

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

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

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

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

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

Подскажите пожалуйста!
« Последнее редактирование: Ноябрь 11, 2012, 20:29 от gil9red » Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 04, 2012, 21:48 »

написать public slot в наследнике QTextEdit и коннектить сигнал к нему как из первого класса, так и из второго
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Июль 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());
    }
};

Так будет правильно?
По крайней мере этот код работает Улыбающийся
« Последнее редактирование: Июль 04, 2012, 22:05 от gil9red » Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 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; // виджеты всё-таки лучше указателями хранить
};
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Июль 04, 2012, 23:04 »

Понятно Улыбающийся
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Июль 04, 2012, 23:08 »

Спасибо за дельный совет Улыбающийся
Записан

Kolobok
Гость
« Ответ #6 : Июль 05, 2012, 00:31 »

Qt::NoContextMenu   the widget does not feature a context menu, context menu handling is deferred to the widget's parent.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Июль 05, 2012, 18:53 »

хх, и вправду, работает с такой политикой Улыбающийся
и никакого лишнего кода Улыбающийся
спасибо, Kolobok Улыбающийся
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Июль 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 работают
Записан

gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Июль 08, 2012, 21:05 »

Похоже придется создавать новую тему..
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 23.