QTabWidget::event() override is never called



  • I've subclassed QTabWidget and provided overrides for the event(QEvent*) and mousePressEvent(QMouseEvent*) virtuals, but they are never called.

    I know that I can install an event filter to handle those events, but why don't the overrides work?

    Here's my class declaration:

    class ViewTabs : public QTabWidget
    {
        Q_OBJECT
    
    public:
        ViewTabs(QWidget *parent=NULL);
        virtual ~ViewTabs();
    
        virtual bool event(QEvent *e);
        virtual void mousePressEvent(QMouseEvent *event);
    };
    

    and the implementation:

    ViewTabs::ViewTabs(QWidget *parent)
    :   QTabWidget(parent)
    {
    }
    
    ViewTabs::~ViewTabs()
    {
    }
    
    bool
    ViewTabs::event(QEvent *e)
    {
        std::cout << "ViewTabs::event() event" << std::endl;
    
        return QTabWidget::event(e);
    }
    
    
    void
    ViewTabs::mousePressEvent(QMouseEvent *event)
    {
        Q_UNUSED(event);
    
        std::cout << "ViewTabs press" << std::endl;
    }
    

    EDIT: The overrides are indeed being called correctly. I had assumed they weren't because print statements placed in them were not appearing on the console. That was because I didn't have the 'console' setting in my CONFIG.



  • @mayaknife hi, friend, welcome

    I tried my Qt and to write test, it can grab mouse click event in subclass QTabWidget

    my snippet code:

    head file

    #ifndef TABWIDGET_H
    #define TABWIDGET_H
    #include <QTabWidget>
    
    class TabWidget : public QTabWidget
    {
    public:
        TabWidget(QWidget* parent = 0);
    
    protected:
        void mousePressEvent(QMouseEvent *event) override;
    };
    
    #endif // TABWIDGET_H
    
    

    cpp file

    #include "tabwidget.h"
    #include <QtCore/QDebug>
    
    TabWidget::TabWidget(QWidget *parent)
        :QTabWidget(parent)
    {
    
    }
    
    void TabWidget::mousePressEvent(QMouseEvent *event)
    {
        QTabWidget::mousePressEvent(event);
        qDebug(".....");
    }
    
    

  • Qt Champions 2016

    Hi

    I can highly recommend to use c++11 keyword override

    virtual bool event(QEvent *event) override;

    as compiler will then tell you if it overrides nothing and u know something is wrong.

    Also to be sure signature ( return type and parameters) is correct, one
    can use the menu to insert base class overrides.

    Right click the class definition ( on the name ) and go to Refactor menu
    alt text
    then you get nice list

    alt text



  • @mrjj

    Using such a long Qt IDE, have not found this method. Best way to insert virtual function. Thank you very much.


  • Qt Champions 2016

    @joeQ
    Well i have been surprised a few times finding a feature that really rocks.
    Like
    When you add a parameter function and it shows that little lamp in the end.
    Press alt+enter to let it change/add the parameter to other file. (.h or .cpp) by itself.

    In Designer , you can actually drag a widget BACK to the widget list and use it as a template for a given
    widget type. So you don't have to set the properties all over. Composite/complex objects also works

    The Refactor right click menu is context sensitive and offer different
    menus depending on the text cursor location.
    Like standing on a member variable , it offers to create get/set function for it.
    alt text
    (alt + enter also works)

    and few other little surprises :)



  • @mrjj
    so surprised, these ways are very convenient and efficient. thank you very much.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.