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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget и контекстное меню  (Прочитано 5727 раз)
gueRRero
Гость
« : Апрель 24, 2009, 09:06 »

Мне нужно сделать контекстное меню в QTreeWidget, пункты которого зависели бы от того, вызвано оно от какого-то элемента, или от пустого места. А именно, необходимо добавлять пункт Properties..., если мышь наведена на элемент. Я написал следующее:

Код:
void MainWindow::ShowContextListMenu()
{
    if(DevicesList->indexOfTopLevelItem(DevicesList->itemAt(QCursor::pos())) >= 0)
PropertiesAct.setVisible(true);
    else
PropertiesAct.setVisible(false);
    ContextListMenu->exec(QCursor::pos());
}

Но DevicesList->indexOfTopLevelItem(DevicesList->itemAt(QCursor::pos())) все время возвращает -1. Как можно решить эту проблему?
« Последнее редактирование: Апрель 24, 2009, 09:18 от guajiro » Записан
gueRRero
Гость
« Ответ #1 : Апрель 24, 2009, 09:33 »

Попробовал сделать так:

Код:
void MainWindow::ShowContextListMenu()
{
if(DevicesList->childAt(QCursor::pos()))
PropertiesAct.setVisible(true);
else
PropertiesAct.setVisible(false);
ContextListMenu->exec(QCursor::pos());
}

Теперь если щелкаешь по левой половине QTreeWidget`а (первые 4 колонки), то все работает как надо, а если по правой (последние 3), то пункта Properties... не появляется. Почму так?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Апрель 24, 2009, 10:25 »

childAt служит для другого:

Цитировать
QWidget * QWidget::childAt ( int x, int y ) const
Returns the visible child widget at the position (x, y) in the widget's coordinate system. If there is no visible child widget at the specified position, the function returns 0.


Может так:

Код
C++ (Qt)
void MainWindow::ShowContextListMenu()
{
if(DevicesList->itemAt(DevicesList->mapFromGlobal(QCursor::pos())))
PropertiesAct.setVisible(true);
else
PropertiesAct.setVisible(false);
ContextListMenu->exec(QCursor::pos());
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
gueRRero
Гость
« Ответ #3 : Апрель 24, 2009, 18:45 »

Спасибо за помощь. Таким образом работает адекватнее, но при вызове меню с последней строки, пункт все равно почему-то не появляется...
Записан
gueRRero
Гость
« Ответ #4 : Апрель 25, 2009, 18:29 »

Методом научного тыка и некоторых размышлений нашел, в чем проблема: QCursor::pos() возвращает положение не конца курсора, а какой-то его другой части. Эмпирически выяснил, что все получается нормально, если написать следующее:

Код
C++ (Qt)
void MainWindow::ShowContextListMenu()
{
QPoint point = QCursor::pos();
if(DevicesList->itemAt(DevicesList->mapFromGlobal(QCursor::pos()-QPoint(0, 25))))
PropertiesAct.setVisible(true);
else
PropertiesAct.setVisible(false);
ContextListMenu->exec(QCursor::pos());
}

Подскажите пожалуйста, как можно обойтись без таких махинаций.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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