qt自定义重写QPushButton

一、前言

需要使用QPushButton的hover效果,即鼠标悬停之后,对应更新界面,离开在恢复界面,以为按键qss有这个功能,函数就也有这个功能,但是被现实狠狠上了一课,发现官方函数并未给出 hover信号,所以只能重写这个类了。

二、环境

qt5.7

win10

三、正文

话不多说,先上代码。

我没有重新建立文件,因为东西不多,就不浪费文件资源了,多了瞅着也乱。

在使用到的函数类下头文件添加:

//重写按键,获取hover状态
class HoverButton : public QPushButton
{
    Q_OBJECT//必须加这句,否者无法建立信号
public:
    HoverButton(const QString& text, QWidget* parent = nullptr)
        : QPushButton(text, parent)
    {
        setAttribute(Qt::WA_Hover);
    }
Q_SIGNALS:
    void mousemode(bool res);

protected:
    void enterEvent(QEvent* event) override
    {
        // 鼠标进入按钮时的操作
        Q_UNUSED(event);
        emit mousemode(true);
//        qDebug() << "Mouse entered the button";
    }
    void leaveEvent(QEvent* event) override
    {
        // 鼠标离开按钮时的操作
        Q_UNUSED(event);
        emit mousemode(false);
//        qDebug() << "Mouse left the button";
    }
};

这里遇到一个很坑的地方就是Q_OBJECT,之前没写,一直报错,后来添加上才正常。

常规使用自定义控件绘图也是如此,只不过父类是QWidget,任何东西都是需要重绘,这里继承QPushButton,只需重写鼠标进入和离开函数即可,然后对应增加信号,在通过外部主函数绑定回调。如下:

        HoverButton *btn_menuJ70x = new HoverButton(boardname[i],ui->widget);//重写QPushButton类
        btn_menuJ70x->setObjectName(tr("btn_menubtnJ70%1").arg(i+1));
        btn_menuJ70x->resize(306,70);
        btn_menuJ70x->move(0,90+70*i);
        btn_menuJ70x->setFont(QFont("黑体", 20, QFont::Bold));//设置文字
        btn_menuJ70x->setCheckable(true);//设置可选
        btn_menuJ70x->setAutoExclusive(true);//设置只有一个复选框可以选择,其他的自动失效
        btn_menuJ70x->setFocusPolicy(Qt::NoFocus);
        connect(btn_menuJ70x,&HoverButton::mousemode,[=](bool res){//鼠标悬停跳转各个界面
            //qDebug() << "Mouse entered the button"<stackedWidget_menunote->setCurrentIndex(i);//切换鼠标悬停板卡检测说明界面
            else ui->stackedWidget_menunote->setCurrentIndex(board.nowboard);//切回选中板卡检测说明界面
        });

麻烦的就是不像在ui里画按键一样,都在ui配置好了,这里需要把使用相关的配置重新都在代码里写一遍。

以上就是完整代码了,如果外部需要调用重写的按键,有两种方式:

方式一就是将按键在头文件私有函数中声明,然后全局均可调用。

方式二就是根据控件名查找

ui->widget->findChild("btn_menubtnJ701")->click();

大功告成。

四、结语

积累积累再积累,记录记录再记录,要不然脑子真不够用,天天搞得东西太多了太杂了

你可能感兴趣的:(#,qt,MyCustomWidget,qt,开发语言,qt重写按键,qt按键悬停,qpushbutton重写)