Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gueRRero от Апрель 24, 2009, 09:06



Название: QTreeWidget и контекстное меню
Отправлено: 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. Как можно решить эту проблему?


Название: Re: QTreeWidget и контекстное меню
Отправлено: gueRRero от Апрель 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... не появляется. Почму так?


Название: Re: QTreeWidget и контекстное меню
Отправлено: pastor от Апрель 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());
}


Название: Re: QTreeWidget и контекстное меню
Отправлено: gueRRero от Апрель 24, 2009, 18:45
Спасибо за помощь. Таким образом работает адекватнее, но при вызове меню с последней строки, пункт все равно почему-то не появляется...


Название: Re: QTreeWidget и контекстное меню
Отправлено: gueRRero от Апрель 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());
}

Подскажите пожалуйста, как можно обойтись без таких махинаций.