Название: Как отловить клик по вкладке QTabWidget? Отправлено: maksimAstraLin от Август 22, 2017, 14:22 Здравствуйте.
Подскажите, пожалуйста, как отловить событие нажатия левой кнопкой мыши по вкладкам QtabWidget? Хочу реализовать drag and drop для вкладок. Если вешать его на нажатие правой кнопкой мыши - работает, а отловить событие нажатия левой кнопкой мыши не получается. Похоже, оно где-то перехватывается и не доходит до класса основного окна. С уважением, Максим. Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: __Heaven__ от Август 22, 2017, 15:30 http://doc.qt.io/qt-5/qtabbar.html#tabBarClicked не подходит?
Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: maksimAstraLin от Август 22, 2017, 15:37 К сожалению, не могу использовать эту функцию. Она появилась только в Qt 5.2, а у меня Qt 4.8 . Прошу прощения, что не указал этого сразу.
Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: Bepec от Август 22, 2017, 15:43 Ставь eventfilter, лови событие нажатия. Ну проще выражаясь реализуй сигнал tabClicked сам :)
Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: maksimAstraLin от Август 22, 2017, 15:52 Подскажите, пожалуйста, что я мог упустить. Мой фильтр не отлавливает нажатие левой кнопкой мыши по "закладке" вкладки QTabWidget'а. Вот мой код фильтра:
Код: bool MainWindow::eventFilter( QObject *watched, QEvent *event ) { Насколько я понимаю, когда я тыкаю на "закладку" вкладки, то включается какой-то другой обработчик, который в том числе занимается перемещением вкладок между собой. Этот обработчик, по-моему, срабатывает до того, как событие доберется до моего фильтра. Этот обработчик возвращает true - типа, "событие отработано" - и дальше оно не распространяется. Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: Igors от Август 22, 2017, 16:43 Снимите "трассу событий", тогда не придется гадать. Вешаете фильтр на qApp.
Код
Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: maksimAstraLin от Август 22, 2017, 17:21 Igors, разъясните, пожалуйста, чайнику...
Я понял, что qApp - это некий глобальный указатель на объект текущего приложения. Но не понимаю, как повесить на него фильтр. Когда передаю этот указатель в installEventFilter( qApp ), то eventFilter не срабатывает ни разу. Ваш класс - MyAppFilter - это чей потомок? Потомок QMainWindow? А еще не понимаю, как реализовать CapsLockPressed()... Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: __Heaven__ от Август 22, 2017, 17:49 А как вам такой вариант ещё?
Наследоваться от QTabBar, добавить слот tabBarClicked(int) по аналогии с Qt5.2 Код Также наследоваться от QTabWidget и в его конструкторе вызвать [protected] void QTabWidget::setTabBar(QTabBar *tb). Кажется, должно сработать. Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: Igors от Август 23, 2017, 08:02 Я понял, что qApp - это некий глобальный указатель на объект текущего приложения. Но не понимаю, как повесить на него фильтр. Когда передаю этот указатель в installEventFilter( qApp ), то eventFilter не срабатывает ни разу. Любой потомок QObject Ваш класс - MyAppFilter - это чей потомок? Потомок QMainWindow? Код
А еще не понимаю, как реализовать CapsLockPressed()... Нвсколько я знаю, в Qt нет средств чтобы определить что сейчас клавиша нажата и удерживается. Поэтому я делал нативными средствами. Для Вындоуз ф-ция GetAsyncKeyState. Это для удобства, чтобы в консоль постоянно не лилосьНазвание: Re: Как отловить клик по вкладке QTabWidget? Отправлено: lit-uriy от Август 24, 2017, 06:08 Не стоит вешать фильтр событий на всё приложение, оно принимает слишком много событий
Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: Igors от Август 24, 2017, 07:12 Не стоит вешать фильтр событий на всё приложение, оно принимает слишком много событий Поэтому и нужна возможность его вкл/выкл клавишейНазвание: Re: Как отловить клик по вкладке QTabWidget? Отправлено: maksimAstraLin от Август 24, 2017, 12:03 Благодарю всех за помощь! Думаю, можно считать задачу решенной.
Igors, до реализации CapsLockPreessed() я не добрался, но, повесив eventFilter на qApp, благодаря qDebug(), я всё же смог выловить, что при клике по "закладке" вкладки происходит 2 события MouseButtonPress: одно для QWidgetWindow, другое - для QTabBar. Тогда я повесил eventFilter на Код: QTabBar *tab_bar = ui->tabWidget->findChild<QTabBar*>(); Код: bool MainWindow::eventFilter( QObject *watched, QEvent *event ) { __Heaven__, попробовал реализовать предложенный Вами вариант с наследованием от QTabBar и QTabWidget, но опыта не хватило сделать также элегантно, как в Вашем коде. Я не знаком с использованием D-Pointer, поэтому пробовал без него. Создал в классе MyTabBar : public QTabBar сигнал tabBar_mouseLeftButtonClicked( int index ) и добавил emit этого сигнала в обработчик события MyTabBar::mousePressEvent(QMouseEvent *event). В конструкторе класса MyTabWidget : public QTabWidget я связал сигнал MyTabBar'а со слотом MainWindow::tabBarClicked(int index): Код: MyTabWidget::MyTabWidget(QWidget *parent) : Название: Re: Как отловить клик по вкладке QTabWidget? Отправлено: __Heaven__ от Август 24, 2017, 15:38 Код, что я предоставил, не мой. Это кусок из исходников qt. Посыл был сделать по аналогии :)
|