Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: maks от Май 08, 2009, 02:29



Название: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: maks от Май 08, 2009, 02:29
Как в QTreeWidget перехватить клик правой кнопкой маши?
Искал соответствующий сигнал и не нашел. А делать наследника как то не хочется.


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: kirill от Май 08, 2009, 06:17
Код
C++ (Qt)
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == treeWidget) {
        if (event->type() == QEvent::MouseButtonPress) {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
            if (mouseEvent->button() == Qt::RightButton){
            qDebug() << "right mouse press";
            return true;
            }
        } else {
            return false;
        }
    } else {
        // pass the event on to the parent class
        return QMainWindow::eventFilter(obj, event);
    }
}

Код
C++ (Qt)
MainWindow::MainWindow()
{
   //...
    treeWidget->installEventFilter(this);
}

PS ху ис маша?


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: ритт от Май 08, 2009, 06:50
насколько я понял из мессаги "Можешь в http://www.prog.org.ru/index.php?topic=9447.msg53980; сказать людям, что можно через контекстменю ще сделать, а то я не успею.  Я убежал.",
panter.dsd предлагает черезжопный (но рабочий) /* или наоборот - рабочий (но черезжопный) */ метод...примерно так:
Код:
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(treeWidget, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(showSplitterContextMenu(const QPoint&)));
%)


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: pastor от Май 08, 2009, 11:40
panter.dsd предлагает черезжопный .... метод

С чего бы это он черезжопный?


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: Пантер от Май 08, 2009, 16:14
Цитировать
[16:26:39] <Пантер> Спасибо, что на форуме ответил. :) Вот только про черезжопность я не понял.
[16:27:22] <Константин > а как заставить этот способ работать, если нужно контекстное меню из акшенов виджета? )
[16:28:11] <Пантер> ??? А как выпадет контекстное меню если ловить правый клик?
[16:28:31] <Константин > так и выпадет
[16:28:55] <Константин > а как в айтемвьюхах селект устанавливается по правому клику одновременно с менюхой?
[16:29:34] <Константин > принимается правый клик, обрабатывается и отправляется дальше по цепочке
[16:30:18] <Пантер> Ну, в showSplitterContextMenu(const QPoint&) можно будет тоже создать меню и показать. :)
[16:30:44] <Пантер> Согласен, это не очень хорошее решение, но иногда оно проще.


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: pastor от Май 08, 2009, 16:21
 ???


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: spirit от Май 08, 2009, 17:14
че-то я тоже не догоняю почему он черезжопный, нормальный способ.


Название: Re: Как в QTreeWidget перехватить клик правой кнопкой маши.
Отправлено: ритт от Май 09, 2009, 11:07
Цитировать
void QWidget::customContextMenuRequested ( const QPoint & pos )   [signal]

This signal is emitted when the widget's contextMenuPolicy is Qt::CustomContextMenu, and the user has requested a context menu on the widget. The position pos is the position of the context menu event that the widget receives. Normally this is in widget coordinates. The exception to this rule is QAbstractScrollArea and its subclasses that map the context menu event to coordinates of the viewport() .

See also mapToGlobal(), QMenu, and contextMenuPolicy.
политика должна быть Qt::CustomContextMenu. если политика иная (нужно нам другое контекстное меню...или вовсе не нужно), сигнала не будет.