Qt实现自定义控件

首先实现自定义控件必然需要 qss 还要自定义一个类,这里先列举自定义按钮的实现方式

首先,需要将 qss 样式设置进来:

QFile qss(":/style/style.qss");
// 以只读的方式打开qss文件
if (qss.open(QFile::ReadOnly)) {
    qDebug("Open success");
    QString style = QLatin1String(qss.readAll());
    a.setStyleSheet(style); // 设置样式表
    qss.close();
}

else {
    qDebug("Open failed");
}

需要重写事件,自定义按钮类的定义如下:

#ifndef CLICKEDBTN_H
#define CLICKEDBTN_H

#include <QPushButton>

class ClickedBtn : public QPushButton
{
    Q_OBJECT
public:
    ClickedBtn(QWidget *parent = nullptr);
    ~ClickedBtn();
    void SetState(QString normal, QString hover, QString press);
protected:
    virtual void enterEvent(QEvent *event) override; // 鼠标进入
    virtual void leaveEvent(QEvent *event) override;
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void mouseReleaseEvent(QMouseEvent *event) override;
private:
    QString m_normal;
    QString m_hover;
    QString m_press;
};

#endif // CLICKEDBTN_H

下面是自定义按钮的实现:

  • 设置初始的动态属性为 normal ,将 SetState() 接口暴露出去便于设置样式
  • 在不同的事件中设置动态属性
#include "clickedbtn.h"
#include "global.h"

ClickedBtn::ClickedBtn(QWidget *parent) : QPushButton(parent)
{
    setCursor(Qt::PointingHandCursor);
    setFocusPolicy(Qt::NoFocus); // 保证不会被回车事件优先触发
}

ClickedBtn::~ClickedBtn()
{

}

void ClickedBtn::SetState(QString normal, QString hover, QString press)
{
    m_normal = normal;
    m_hover = hover;
    m_press = press;
    setProperty("state", normal); // 设置动态属性
    repolish(this);
    update();
}

void ClickedBtn::enterEvent(QEvent *event)
{
    setProperty("state", m_hover);
    repolish(this);
    update();
    QPushButton::enterEvent(event);
}

void ClickedBtn::leaveEvent(QEvent *event)
{
    setProperty("state", m_normal);
    repolish(this);
    update();
    QPushButton::leaveEvent(event);
}

void ClickedBtn::mousePressEvent(QMouseEvent *event)
{
    setProperty("state", m_press);
    repolish(this);
    update();
    QPushButton::mousePressEvent(event);
}

void ClickedBtn::mouseReleaseEvent(QMouseEvent *event)
{
    setProperty("state", m_hover);
    repolish(this);
    update();
    QPushButton::mouseReleaseEvent(event);
}
/**
 * @brief repolish 用来刷新qss(使样式表生效)
 */
extern std::function<void(QWidget*)> repolish;

std::function<void(QWidget*)> repolish = [](QWidget *w) {
    w->style()->unpolish(w);
    w->style()->polish(w);
};

下面是设置的是类型为 ClickedBtn (通过类提升),名称为 add_btn 的三种 qss 样式的设置

#add_btn[state='normal'] {
    border-image: url(:/res/add_friend_normal.png);
}

#add_btn[state='hover'] {
    border-image: url(:/res/add_friend_hover.png);
}

#add_btn[state='press'] {
    border-image: url(:/res/add_friend_hover.png);
}

在外部调用接口,将设置的动态属性名称传进去,这样自定义控件的实现就完成了

ui->add_btn->SetState("normal", "hover", "press");
下面是一个简单的 Qt 自定义控件的例子,实现了一个带有渐变背景色和圆角边框的按钮: ```cpp #include <QPainter> #include <QMouseEvent> #include <QColor> class CustomButton : public QWidget { Q_OBJECT public: CustomButton(QWidget *parent = nullptr) : QWidget(parent) { setFixedSize(100, 30); setMouseTracking(true); } void setText(const QString &text) { m_text = text; update(); } QString text() const { return m_text; } protected: void paintEvent(QPaintEvent *event) override { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 绘制背景色 QLinearGradient gradient(0, 0, 0, height()); gradient.setColorAt(0, QColor(100, 100, 100)); gradient.setColorAt(1, QColor(150, 150, 150)); painter.setBrush(gradient); painter.drawRoundedRect(rect(), 5, 5); // 绘制文字 painter.setPen(QColor(255, 255, 255)); painter.drawText(rect().center() - QRectF(0, 0, 0, 14).center(), m_text); } void enterEvent(QEvent *event) override { // 鼠标进入控件时改变背景色 m_oldBrush = palette().brush(backgroundRole()); QLinearGradient gradient(0, 0, 0, height()); gradient.setColorAt(0, QColor(150, 150, 150)); gradient.setColorAt(1, QColor(200, 200, 200)); QBrush brush(gradient); palette().setBrush(backgroundRole(), brush); update(); } void leaveEvent(QEvent *event) override { // 鼠标离开控件时恢复背景色 palette().setBrush(backgroundRole(), m_oldBrush); update(); } void mousePressEvent(QMouseEvent *event) override { // 发射 clicked 信号 emit clicked(); } signals: void clicked(); private: QString m_text; QBrush m_oldBrush; }; ``` 在上面的代码中,我们继承了 QWidget 类,实现了自己的 paintEvent()、enterEvent()、leaveEvent() 和 mousePressEvent() 函数,分别用于绘制控件、改变背景色、恢复背景色和响应鼠标点击事件。我们还定义了一个 clicked 信号,用于通知外部程序按钮被点击了。 这个自定义控件是一个简单的按钮,但是可以通过修改代码和样式表来实现更多的功能和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值