crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Над каким виджетом отрабатывает QAction?
hkarel
  опции профиля:
сообщение 5.6.2010, 22:17
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 25.5.2009
Пользователь №: 771

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




Репутация:   0  


Имеется два компонента: QTextEdit *te1, *te2. Имеется QAction *act. QAction связан с te1 и te2.
te1->addAction(act);
te2->addAction(act);

Соответственно в контекстных меню te1 и te2 появляется добавленный act. В свою очередь act имеет связанный слот on_act_triggered(), который отрабатывает при нажатии на пункт меню в обоих QTextEdit.
Вопрос: возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.6.2010, 2:06
Сообщение #2


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

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

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




Репутация:   94  


Цитата(hkarel @ 6.6.2010, 2:17) *
возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction?
нет.
можно попробовать другую реализацию задуманного. Для каждого виджета можно установить политику контекстного меню
setContextMenuPolicy(Qt::CustomContextMenu)
тогда при щелчке правой кнопкой мыши будет посылаться сигнал customContextMenuRequested

соединяешь его со слотом примерно такого вида:
 void MyWindow::showContextMenu(const QPoint &p)
{
     myMenu->popup(p);
}
Пример можно глянуть в демке demos/qmediaplayer/mediaplayer.cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hkarel
  опции профиля:
сообщение 6.6.2010, 21:54
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 25.5.2009
Пользователь №: 771

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




Репутация:   0  


Ну, а что это мне даст? Предлагаете где-то запоминать указатель на текущий виджет, а в on_act_triggered() его использовать? Согласен, это вариант.
Изначально я шел немного по другому пути: изнутри on_act_triggered() возможно определить список QMenu к которым принадлежит act, соответственно QTextEdit тоже определяется без проблем. А вот определить какой из QMenu послужил инициатором события on_act_triggered() у меня не получилось, может где-то доки не дочитал ... Вот если бы как-то можно было это сделать ...

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.6.2010, 22:55
Сообщение #4


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

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

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




Репутация:   94  


Цитата(hkarel @ 7.6.2010, 1:54) *
Предлагаете где-то запоминать указатель
зачем?
в слоте showContextMenu, виджет отправитель сигнала скажет функция sender()

Цитата(hkarel @ 6.6.2010, 2:17) *
возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction?
Цитата(hkarel @ 7.6.2010, 1:54) *
изнутри on_act_triggered() возможно определить список QMenu к которым принадлежит act, соответственно QTextEdit тоже определяется без проблем
что-то тут не сходится
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hkarel
  опции профиля:
сообщение 7.6.2010, 9:34
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 25.5.2009
Пользователь №: 771

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 6.6.2010, 22:55) *
Цитата(hkarel @ 7.6.2010, 1:54) *
Предлагаете где-то запоминать указатель
зачем?
в слоте showContextMenu, виджет отправитель сигнала скажет функция sender()

Когда я попаду в on_act_triggered() функция showContextMenu уже давно отработает, соответственно ее сендер мне поможет только для запоминания указателя на вызванное меню. Причем если меню будет вложенное, а оно будет таким, то код еще и усложнится отслеживанием иерархии меню.

Цитата
Цитата(hkarel @ 6.6.2010, 2:17) *
возможно ли определить изнутри on_act_triggered() для какого QTextEdit (te1 или te2) был вызван QAction?
Цитата(hkarel @ 7.6.2010, 1:54) *
изнутри on_act_triggered() возможно определить список QMenu к которым принадлежит act, соответственно QTextEdit тоже определяется без проблем
что-то тут не сходится

Чему же тут не сходиться? Изначально я сформулировал задачу не приводя своих решений, дабы не задавать конкретного направления. Вы привели еще одно решение. Теперь я пытаюсь понять как его можно использовать, а заодно привожу свое, не доведенное до конца.
Ближе к практике:
WordsListView* parentListView(QAction* act)
{
    QList<QWidget*> wl = act->associatedWidgets();
    for (int i = 0; i < wl.count(); ++i)
        if (QMenu* menu = qobject_cast<QMenu*>(wl[i]))
            // !!! Вот тут очень слабо: isVisible() не дает нужного результата
            if (menu->isVisible())
                if (QWidget* w = menu->parentWidget())
                    if (WordsListView* lv = qobject_cast<WordsListView*>(w))
                        return lv;

    return 0;
}

void ADict::on_actDeletePronunciation_triggered()
{
    ......
    QAction* act = qobject_cast<QAction*>(sender());
    WordsListView* list_words = parentListView(act);
    if (list_words == 0) return;

    .......
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
inviZ
  опции профиля:
сообщение 7.6.2010, 16:59
Сообщение #6


Студент
*

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

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




Репутация:   1  


Цитата
Ее сендер мне поможет только для запоминания указателя на вызванное меню.

Это с чего вдруг? В слоте showContextMenu, который подсоединен к customContextMenuRequested, sender() вернет указатель на твой виджет, для которого вызвано контекстное меню. Ну и запоминаешь его где-нибудь... Например, так:
act->setData(qVariantFromValue(sender()));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.6.2010, 17:20
Сообщение #7


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

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

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




Репутация:   94  


inviZ, примерно тоже имел в виду и я, однако я забыл про существование QAction::setData
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hkarel
  опции профиля:
сообщение 9.6.2010, 21:13
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 25.5.2009
Пользователь №: 771

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




Репутация:   0  


Вот только руки "дошли" до задачи.
Цитата(inviZ @ 7.6.2010, 17:59) *
Цитата
Ее сендер мне поможет только для запоминания указателя на вызванное меню.

Это с чего вдруг? В слоте showContextMenu, который подсоединен к customContextMenuRequested, sender() вернет указатель на твой виджет ...

Ну, в общем - да, согласен.
act->setData(qVariantFromValue(sender())) - не подойдет, т.к. неразумно делать этот вызов для всех пунктов меню, вдобавок этот механизм используется для других нужд.
В общем остановился на том, чтобы запоминать сендер как указатель на уровне формы.
inviZ, Litkevich Yuriy - спасибо за консультацию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 13:49