简体   繁体   中英

Qt custom QPushButton doesn't show up on layout

I wrote my own custom QPushbutton class to capture hover event. Thing is when I try to display my custom button it doesn't show up, but capturing hover event works just fine (it prints to console) and QPushButton also appears on the form. Also when I kill bool event(QEvent *) function button shows on display like it supposed to.

SButton.h

#include <QPushButton>
#include <QEvent>
#include <QObject>

class SButton : public QPushButton {
    Q_OBJECT
public:
    SButton(QWidget *parent = nullptr) : QPushButton(parent) {}
    SButton(const QString &text, QWidget *parent = nullptr): QPushButton(text, parent){}
    SButton(const QIcon& icon, const QString &text, QWidget *parent = nullptr) : QPushButton(icon, text, parent){}
signals:
    void HoverIn();
    void HoverOut();

protected:
    bool event(QEvent *event);
private:
    QWidget* p;
};

MainWindow.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

    ui->setupUi(this);


    QWidget *MainWidget=new QWidget();
    this->setCentralWidget(MainWidget);

    QHBoxLayout *layoutAdd=new QHBoxLayout();
    QPushButton *bSelect=new QPushButton("Select group or company"); //this one does just fine
    SButton *bAdd=new SButton("Add new group or company", MainWidget);  //this one makes the problem

    layoutAdd->addWidget(bSelect);
    layoutAdd->addWidget(bAdd);
    bAdd->show();
    MainWidget->setLayout(layoutAdd);
    MainWidget->show();

    connect(bAdd, &SButton::HoverIn, bAdd, []() {QTextStream(stdout) << "got there at least" << "\n";});

SButton.cpp:

#include <SButtons.h>
#include <QTextStream>

bool SButton::event(QEvent *event) {


    switch(event->type()) {
    case QEvent::Enter:
        emit HoverIn();
        QTextStream(stdout) << "Enter" << "\n";
        return true;
        break;
    case QEvent::Leave:
        emit HoverOut();
        QTextStream(stdout) << "Leave" << "\n";
        return true;
        break;
    default:
        return false;
        break;
    }
    return QPushButton::event(event);
}

Edit : As mentioned earlier, you ignore all the events and return false:

    default:
        return false;
        break;
    }
    return QPushButton::event(event); // this line is never reached

Instead do this:


    default:
        break;
    }
    return QPushButton::event(event);

   //OR
   default:
       return QPushButton::event(event); 

You are probably ignoring the events in bool event(QEvent *event); of SButton class. Try this:

bool SButton::event(QEvent* event)
{
    if (event->type() == QEvent::HoverEnter) {
        emit HoverIn();
    }
    // Other events...

    return QPushButton::event(event);
}

As a side note, break after return is just noise:

        return true;
        //break; <-- remove

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM