crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> как добавить свои пункты в существующее контекстное меню меню?, (начинающий)
dimamix
  опции профиля:
сообщение 14.4.2011, 16:13
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 8.4.2011
Пользователь №: 2582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.
Продолжаю писать плагин на питоне для Qgis.
В качестве gui используется QT.
Отображением дерева проекта заведует объект QTreeWidget.
QTreeWidgetItem - являются некие объекты "GROUP" и "LAYER".
Сделал свое меню

 self.actionLoadCategory = QAction(QIcon(":/plugins/testplugingl_mix/mix32.png"), u"Загрузка слоёв", None)
QObject.connect(self.actionLoadCategory, SIGNAL("triggered()"), self.loadDataCategory)
self.iface.addPluginToMenu("&Test plugin", self.actionLoadCategory)


У объектов "GROUP" и "LAYER" уже есть контекстные меню.

конкретный вопрос:
Можно ли (и если можно, то как ) добавить свои пункты в существующее контекстное меню меню?

зы
на С читаю, со словарем :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.4.2011, 5:22
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dimamix @ 14.4.2011, 19:13) *
Можно ли (и если можно, то как ) добавить свои пункты в существующее контекстное меню меню?
пункты меню - QAction их и добавляй, см. описание QMenu
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dimamix
  опции профиля:
сообщение 15.4.2011, 8:38
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 8.4.2011
Пользователь №: 2582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.4.2011, 6:22) *
Цитата(dimamix @ 14.4.2011, 19:13) *
Можно ли (и если можно, то как ) добавить свои пункты в существующее контекстное меню меню?
пункты меню - QAction их и добавляй, см. описание QMenu


Прошу прощения, видимо не совсем правильный вопрос задал, исправляю....
Как получить доступ к существующему контекстному меню объекта QTreeWidgetItem для добавления своих пунктов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dimamix
  опции профиля:
сообщение 15.4.2011, 9:59
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 8.4.2011
Пользователь №: 2582

Спасибо сказали: 0 раз(а)




Репутация:   0  


        # создал действие, которое будет запускать  загрузку таблиц по категории из ветви дерева
        self.action = QAction(QIcon(":/plugins/testplugingl_mix/mix32.png"), u"Загрузка слоёв", None)
        # подключил действие и функцию self.loadCurrentCategory()
        QObject.connect(self.action, SIGNAL("triggered()"), self.loadCurrentCategory)

        # получил QTreeWidgetItem
        currGrp=self.legendTree.currentItem()

        # получаем QTreeWidget
        tw=currGrp.treeWidget()

        # А вот дальше не понятно
        # tw.actions() == 0  ???
        # хотя контекстное меню - уже есть

        tw.addAction( self.action )
        # в результате только родное меню, без добавляемой строки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
novichkov
  опции профиля:
сообщение 16.4.2011, 15:55
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

Спасибо сказали: 6 раз(а)




Репутация:   1  


Надо перехватить создание события "вызов контекстного меню", явно создать контекстное меню, а затем добавить в него нужные пункты.
Я делал это для QLineEdit:

class LineEdit : public QLineEdit
{
    Q_OBJECT
public:
    LineEdit(QWidget *parent = 0);
protected:
    void contextMenuEvent(QContextMenuEvent *);
private slots:
    void actionTriggered();
private:
    QList<QAction *> acts;
// это только для динамического перевода, можно и не запоминать
};


LineEdit::LineEdit(QWidget *parent)
    : QLineEdit(parent),
{
    //создаем свои действия и заосим их в список
        QAction *a=new QAction(tr("..."),this);
        connect(a,SIGNAL(triggered()),SLOT(actionTriggered()));
        acts << a;

//и так далее
    }
}

void LineEdit::actionTriggered()
{
    QAction *a = qobject_cast<QAction *>(sender());
    if (!a) return;
    //дальше нужные действия
}

void LineEdit::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu *menu = createStandardContextMenu();
    menu->insertSeparator(menu->actions().at(0));
//если надо добавить действия в отдельное выпадающее меню
    QMenu *setAsMenu = new QMenu(tr("Set into..."),menu);
    setAsMenu->addActions(acts);
    menu->insertMenu(menu->actions().at(0),setAsMenu);
//или прямо:  menu->addActions(acts);

    menu->exec(event->globalPos());
    delete menu;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dimamix
  опции профиля:
сообщение 18.4.2011, 8:53
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 8.4.2011
Пользователь №: 2582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо.
Буду переваривать.....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 14:02