【Qt 控件】自定義按鈕


效果圖


核心源代碼

MyButton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <QMouseEvent>

class MyButton : public QWidget
{
    Q_OBJECT

public:
    explicit MyButton(const bool& bType = false, QWidget *parent = 0);
    void SetPaintText(const QString& sText); // 設置繪制文本
    void SetBlockColor(const QColor& color); // 設置色塊顏色
    QString GetPaintText(); // 獲得繪制文本
    QColor GetBlockColor(); // 獲得色塊顏色

protected:
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; // 繪制事件
    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; // 鼠標按下事件
    void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; // 鼠標釋放事件

signals:
    // 狀態改變時,發射信號
    void toggled();

private:
    bool m_bChecked;         // 是否選中
    QColor m_checkColor;   // 選中顏色
    QString m_sText; // 繪制文本

    bool m_bType; // 為0則顯示文本,為1則顯示色塊
};

#endif // MYBUTTON_H

MyButton.cpp

#include "MyButton.h"

MyButton::MyButton(const bool& bType, QWidget *parent)
    : QWidget(parent)
{
    // 鼠標滑過光標形狀 - 手型
    setCursor(Qt::PointingHandCursor);

    m_checkColor = QColor(0, 150, 136);
    m_bChecked = false;
    m_bType = bType;

    this->setFixedSize(128, 60);
}

// 繪制開關
void MyButton::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    // 根據按鈕狀態,設置繪制顏色
    QColor paintColor;
    if (isEnabled()) { // 判斷按鈕是否可用
        // 可用狀態
        if (m_bChecked)
            paintColor = QColor(73, 143, 248);
        else
            paintColor = QColor(112, 112, 112);
    } else {
        // 不可用狀態
        paintColor = QColor(190, 190, 190, 0.26);
    }

    QPainter painter(this);
    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);
    // 設置畫筆顏色
    QPen pen;
    pen.setWidth(3);
    pen.setColor(paintColor);
    painter.setPen(pen);
    // 繪制邊框
    painter.drawRoundRect(0, 0, 128, 60, 8);
    // 繪制多邊形-倒三角形箭頭
    const QPointF points[4] = {QPointF(84, 20), QPointF(106, 20), QPointF(95, 40), QPointF(84, 20)};
    painter.setBrush(paintColor);
    painter.drawPolygon(points, 4);

    if (!m_bType) {
        // 繪制文本
        QFont font;
        font.setFamily("Microsoft YaHei");
        font.setPointSize(20);
        painter.setFont(font);
        painter.drawText(QRect(14, 11, 128, 60), m_sText);
    } else {
        // 繪制色塊
        if (m_checkColor.red() == 255) {
            painter.setPen(QPen(QColor(191, 191, 191), 1)); // 設置邊框顏色
            painter.setBrush(m_checkColor);
            painter.drawRoundRect(12, 10, 41, 41, 5, 5);
        } else {
            painter.setPen(m_checkColor);
            painter.setBrush(m_checkColor);
            painter.drawRoundRect(12, 10, 41, 41, 5, 5);
        }
    }
}

// 鼠標按下事件
void MyButton::mousePressEvent(QMouseEvent *event)
{
    if (isEnabled()) {
        if (event->buttons() & Qt::LeftButton) {
            m_bChecked = true;
            this->update();
        }
    }
}

// 鼠標釋放事件 - 切換開關狀態、發射toggled()信號
void MyButton::mouseReleaseEvent(QMouseEvent *event)
{
    if (isEnabled()) {
        if ((event->type() == QMouseEvent::MouseButtonRelease) \
                && (event->button() == Qt::LeftButton)) {
            event->accept();
            emit toggled();
            m_bChecked = false;
            this->update();
        }
    }
}

// 設置繪制文本
void MyButton::SetPaintText(const QString& sText)
{
    m_sText = sText;
    this->update();
}

// 設置色塊顏色
void MyButton::SetBlockColor(const QColor& color)
{
    m_checkColor = color;
}

// 獲得繪制文本
QString MyButton::GetPaintText()
{
    return m_sText;
}

// 獲得色塊顏色
QColor MyButton::GetBlockColor()
{
    return m_checkColor;
}

Widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化自定義按鈕
    MyButton *pBtnPos = new MyButton(false);
    MyButton *pBtnSize = new MyButton(false);
    MyButton *pBtnColor = new MyButton(true);
    pBtnPos->SetPaintText(QString::fromLocal8Bit("居中"));
    pBtnColor->SetBlockColor(QColor(196, 68, 21));
    pBtnSize->SetPaintText(QString::fromLocal8Bit("20px"));

    // 水平布局
    QHBoxLayout *pHLayoutMain = new QHBoxLayout(this);
    pHLayoutMain->addWidget(pBtnPos);
    pHLayoutMain->addWidget(pBtnColor);
    pHLayoutMain->addWidget(pBtnSize);

    // 連接信號槽
    connect(pBtnPos, SIGNAL(toggled()), this, SLOT(onToggled()));
    connect(pBtnColor, SIGNAL(toggled()), this, SLOT(onToggled()));
    connect(pBtnSize, SIGNAL(toggled()), this, SLOT(onToggled()));
}

Widget::~Widget()
{
    delete ui;
}

// 自定義按鈕觸發信號槽
void Widget::onToggled()
{
    qDebug() << "clicked";
}

GitHub代碼下載

下載鏈接為:https://github.com/confidentFeng/QtAppProject/tree/MyButton



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM