нажатие мыши на событие и qtabwidget

#qt #qtabwidget

#qt #qtabwidget ( таблица виджетов ) #qtabwidget

Вопрос:

необходимо, чтобы, когда мышь (с нажатой кнопкой) находится поверх вкладки, она активировалась. Как это возможно.

Ответ №1:

Вы можете перехватить событие mouseMoveEvent из QTabBar.

Редактировать: как

Чтобы перехватить его, Qt предлагает вам отличные функциональные возможности. Вы можете установить фильтр событий на созданный вами виджет, чтобы он мог получать отфильтрованные события своих дочерних виджетов. Смотрите документацию о функции installEventFilter.

Комментарии:

1. учитывая, что я относительно умеренный. Как я могу это сделать. Должен ли я создать подкласс qtabbar, подобный примеру droparea в сети. предлагаю. спасибо, что поделились до сих пор.

2. Вы можете создать подкласс QTabBar, но Qt предлагает другое более простое решение для получения события дочернего виджета: смотрите Мой обновленный ответ

Ответ №2:

Просто создайте свой собственный eventFilter.

 // TabBarEventHandler
class TabBarEventHandler : public QObject
{
public:
    explicit TabBarEventHandler( QTabWidget * tabWidget );
    virtual ~TabBarEventHandler();

    void Initialize();

protected:
    QTabWidget  * mTabWidget;

    virtual bool eventFilter( QObject* obj, QEvent* event ) override;
};


// TabBarEventHandler
TabBarEventHandler::TabBarEventHandler( TabBar * tabWidget ) 
    : mTabWidget( tabWidget )
{
}

TabBarEventHandler::~TabBarEventHandler()
{
    mTabWidget->tabBar()->removeEventFilter( this );
}

void TabBarEventHandler::Initialize()
{
    mTabWidget->tabBar()->installEventFilter( this );
}

bool TabBarEventHandler::eventFilter(QObject* obj, QEvent* event)
{
    qDebug() << event->type();

    return QObject::eventFilter( obj, event );
}

void TabBarEventHandler::timerEvent(QTimerEvent* event)
{
}
  

И в вашем виджете:

 MyTabWidget::MyTabWidget( QWidget * parent ) : QTabWidget( parent )
{
    mEventHandler = new TabBarEventHandler( this );
    mEventHandler->Initialize();
}

MyTabWidget::~MyTabWidget()
{
    delete mEventHandler;
}
  

Вывод отладки:

QEvent::Type (перемещение в режиме реального времени) QEvent::Type (перемещение в режиме реального времени) QEvent ::Type (нажатие кнопки мыши) QEvent::Type(InputMethod query) QEvent::Type(входной метод запроса) QEvent::Type (входной метод запроса) QEvent::Type (Paint) QEvent::Type (Paint) QEvent::Type(MouseButtonRelease) QEvent ::Type (HoverMove) QEvent ::Type (HoverMove) QEvent :: Type(Оставить)