c++ - Qt自定义QPushButton不在布局上显示

标签 c++ qt widget

我编写了自己的自定义QPushbutton类来捕获悬停事件。问题是,当我尝试显示自定义按钮时,它没有显示,但是捕获悬停事件就可以了(它可以打印到控制台),并且QPushButton也显示在表单上。另外,当我杀死bool event(QEvent *)功能按钮时,它会像预期的那样显示在屏幕上。
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);
}

最佳答案

编辑:如前所述,您将忽略所有事件并返回false:

    default:
        return false;
        break;
    }
    return QPushButton::event(event); // this line is never reached
而是这样做:

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

   //OR
   default:
       return QPushButton::event(event); 
您可能会忽略bool event(QEvent *event);类的SButton中的事件。尝试这个:
bool SButton::event(QEvent* event)
{
    if (event->type() == QEvent::HoverEnter) {
        emit HoverIn();
    }
    // Other events...

    return QPushButton::event(event);
}
附带说明一下,break之后的return只是噪音:
        return true;
        //break; <-- remove

关于c++ - Qt自定义QPushButton不在布局上显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62776229/

相关文章:

c++ - 尝试使用新构造函数和复制构造函数分配内存时获取 "expected unqualified-id before ‘(’ token

python - 将 <Python.h> 包含到 makefile.am

c++ - 如何为静态 Qt 项目指定不同的库?

javascript - 节点中带有网格的 Ext JS 树 - 组合小部件

c++ - 没有成员使用gcc和clang在 'str'中名为 'std::basic_ostream<char>'的成员,但是msvc没问题

qt - QObject 无法为处于不同线程中的父对象创建子对象

c++ - 在 Qt 中保存和恢复带有图像的 QLabel

java - 使用SWT浏览器Widget编写桌面应用程序

python - 获取触发事件的小部件?

C++ 返回值与异常性能