qt 自定义按钮图标

  • 自定义按钮样式,鼠标悬停时,鼠标离开时,鼠标点击时。按钮有文本、背景、图标可设置。
  • 1、设置背景直接通过setStyleSheet样式设计即可
  • 如:
ui->pushButton_3->setStyleSheet("QPushButton{background-color:rgb(255,182,193);}"
		                "QPushButton:hover{background-color:rgb(219,112,147);}"
		                "QPushButton:pressed{background-color:rgb(199,21,133);}");
  • hover 表示鼠标悬停时的样式;pressed 表示鼠标点击时的样式;不加则表示按钮默认的样式也是鼠标离开后的样式。
  • 2、设置图标,一种也是可以通过setStyleSheet样式设计
  • 如:
ui->pushButton_4->setStyleSheet("QPushButton{border-image:url(:/src/back_b.png);}"
                      "QPushButton:hover{border-image:url(:/src/back_w.png);}"
                      "QPushButton:pressed{border-image:url(:/src/back_w.png);}");
  • 即关键代码:border-image:属性设置即可。但是这个属性相当于是设置的按钮的背景,如果需要再设置文本,则会直接覆盖在背景上。
  • 2、所以第二种就是通过设置图标即setIcon,这里最好是直接新建一个类,专门设置按钮在鼠标几种情况下的图标,然后按钮再提升为此方法。
  • 先看案例效果:

在这里插入图片描述

  • 该例子包含文件:
  • 在这里插入图片描述
  • ui设计界面控件布局情况:
    在这里插入图片描述
  • btn.h:
#ifndef BTN_H
#define BTN_H

#include <QPushButton>
class btn : public QPushButton
{
    Q_OBJECT
public:
    explicit btn(QWidget *parent = nullptr);

    void set_btn_icon(QString normal_icon, QString hover_icon, QString click_icon);
protected:
    void enterEvent(QEvent *event);//鼠标悬停时
    void leaveEvent(QEvent *event);//鼠标离开时
    void mousePressEvent(QMouseEvent *event);//鼠标点击时

private:
    QString m_normal_icon;
    QString m_hover_icon;
    QString m_click_icon;

};
#endif // BTN_H

  • btn.cpp:
#include "btn.h"
#include <QMouseEvent>
btn::btn(QWidget *parent): QPushButton(parent)
{

}

void btn::set_btn_icon(QString normal_icon, QString hover_icon, QString click_icon)
{
    m_normal_icon = normal_icon;
    m_hover_icon = hover_icon;
    m_click_icon = click_icon;

    setIcon(QIcon(m_normal_icon));//设置图标
}
//鼠标悬停时
void btn::enterEvent(QEvent *event)
{
    setIcon(QIcon(m_hover_icon));
    QPushButton::enterEvent(event);
}
//鼠标离开时
void btn::leaveEvent(QEvent *event)
{
    setIcon(QIcon(m_normal_icon));
    QPushButton::enterEvent(event);
}
//鼠标点击时
void btn::mousePressEvent(QMouseEvent *event)
{
    if (Qt::LeftButton == event->button())
        setIcon(QIcon(m_click_icon));

    QPushButton::mousePressEvent(event);
}

  • widget.h:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_close_clicked();

    void on_pushButton_max_clicked();

    void on_pushButton_min_clicked();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

.widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QStyle>
#include <QMessageBox>
#include "btn.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    setWindowFlags(Qt::FramelessWindowHint);

    ui->widget->setObjectName("title_widget");
    ui->widget->setStyleSheet("QWidget#title_widget{background-color:rgb(200,200,200)}");

    ui->pushButton_close->setFixedSize(20,20);//设置按钮大小
    ui->pushButton_close->setText("");        //清空文本
    ui->pushButton_max->setFixedSize(20,20);
    ui->pushButton_max->setText("");
    ui->pushButton_min->setFixedSize(20,20);
    ui->pushButton_min->setText("");

    //初始化按钮悬停,点击,离开时的图标
    ui->pushButton_close->set_btn_icon(":/src/close_b.png",
                                       ":/src/close_w.png",
                                       ":/src/close_w.png");
    ui->pushButton_min->set_btn_icon(":/src/min.png",
                                     ":/src/min.png",
                                     ":/src/min.png");
    ui->pushButton_max->set_btn_icon(":/src/nomol.png",
                                     ":/src/nomol.png",
                                     ":/src/nomol.png");


    //设置按钮按钮悬停,点击,离开时的背景和边框样式
    ui->pushButton_close->setStyleSheet("QPushButton{border-radius:10px;}"
                  "QPushButton:hover{background-color:rgb(204,0,0);"
                                        "border-radius:10px;}"
                  "QPushButton:pressed{background-color:rgb(244,92,94);"
                                        "border-radius:10px;}");

     ui->pushButton_max->setStyleSheet("QPushButton{border-radius:10px;}"
                  "QPushButton:hover{background-color:rgb(255,192,0);"
                                       "border-radius:10px;}"
                  "QPushButton:pressed{background-color:rgb(255,217,102);"
                                       "border-radius:10px;}");

     ui->pushButton_min->setStyleSheet("QPushButton{border-radius:10px;}"
                  "QPushButton:hover{background-color:rgb(82,127,52);"
                                       "border-radius:10px;}"
                  "QPushButton:pressed{background-color:rgb(0,176,80);"
                                       "border-radius:10px;}");



     ui->pushButton_3->setStyleSheet("QPushButton{background-color:rgb(255,182,193);"
                                     "border-radius:10px;}"
                  "QPushButton:hover{color:rgb(255,255,255);"
                                     "background-color:rgb(219,112,147);"
                                     "border-radius:10px;}"
                  "QPushButton:pressed{color:rgb(255,255,255);"
                                     "background-color:rgb(199,21,133);"
                                     "border-radius:10px;}");
     ui->pushButton_3->setFixedHeight(40);
     ui->pushButton_3->setText("点我试一试!");


    ui->label_2->setText("当前状态:默认大小");
    ui->label->setText("这是一个按钮测试界面,鼠标悬停,点击,离开时会有不同效果;"
                       "左上角是图标和背景发生变化,"
                       "上面是文本内容和背景变化,下面是图标和背景还有文字发生变化");
    ui->label->setWordWrap(true);//自动换行

     ui->pushButton->setText("删除");
     ui->pushButton->setFixedSize(70,30);
     ui->pushButton->set_btn_icon(":/src/delete_b.png",
                                  ":/src/delete_w.png",
                                  ":/src/delete_w.png");
     ui->pushButton->setStyleSheet("QPushButton{border: 1px solid;"
                                   "border-radius:5px;}"
                                   "QPushButton:hover{border: 0px solid;"
                                   "color:rgb(255,255,255);"
                                   "background-color:rgb(204,0,0);"
                                   "border-radius:5px;}"
                                   "QPushButton:pressed{border: 0px solid;"
                                   "background-color:rgb(244,92,94);"
                                   "border-radius:5px;}");

     ui->pushButton_2->setText("返回");
     ui->pushButton_2->setFixedSize(70,30);
     ui->pushButton_2->set_btn_icon(":/src/back_b.png",
                                    ":/src/back_w.png",
                                    ":/src/back_w.png");
     ui->pushButton_2->setStyleSheet("QPushButton{border: 1px solid;"
                                     "border-radius:5px;}"
                                   "QPushButton:hover{border: 0px solid;"
                                     "color:rgb(255,255,255);"
                                     "background-color:rgb(82,127,52);"
                                     "border-radius:5px;}"
                                   "QPushButton:pressed{border: 0px solid;"
                                     "background-color:rgb(0,176,80);"
                                     "border-radius:5px;}");


     ui->pushButton_4->setFixedSize(20,20);
     ui->pushButton_4->setStyleSheet("QPushButton{border-radius:5px;"
                                     "border-image:url(:/src/back_b.png);}"
                                   "QPushButton:hover{border: 0px solid;"
                                     "color:rgb(255,255,255);"
                                     "background-color:rgb(82,127,52);"
                                     "border-radius:5px;"
                                     "border-image:url(:/src/back_w.png);}"
                                   "QPushButton:pressed{border: 0px solid;"
                                     "background-color:rgb(0,176,80);"
                                     "border-radius:5px;"
                                     "border-image:url(:/src/back_w.png);}");
}

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


void Widget::on_pushButton_close_clicked()
{
    this->close();
}

void Widget::on_pushButton_max_clicked()
{
    if(isMaximized()){
        ui->pushButton_max->set_btn_icon(":/src/nomol.png",
                                         ":/src/nomol.png",
                                         ":/src/nomol.png");
        this->showNormal();//正常大小
        ui->label_2->setText("当前状态:默认大小");
    }else{
        ui->pushButton_max->set_btn_icon(":/src/max.png",
                                         ":/src/max.png",
                                         ":/src/max.png");
        this->showMaximized();//最大化
        ui->label_2->setText("当前状态:最大化");
    }
}

void Widget::on_pushButton_min_clicked()
{
    this->showMinimized();//最小化
}

void Widget::on_pushButton_clicked()
{
    QMessageBox::information(this,"删除","你点击了删除!");
}

void Widget::on_pushButton_2_clicked()
{
    QMessageBox::information(this,"返回","你点击了返回!");
}

void Widget::on_pushButton_3_clicked()
{
    static int cnt = 0;
    cnt++;
    ui->pushButton_3->setText(QString("你点了我%1次!有本事你再点一下试试!").arg(cnt));
    if(cnt >= 3)
         ui->pushButton_3->setText("算你狠!");
}

void Widget::on_pushButton_4_clicked()
{
    QMessageBox::information(this,"按钮","这是通过setStyleSheet设置的图标");
}

案例源码下载 提取码:53bf

是的,Qt自定义对话框可以添加按钮。您可以使用Qt提供的QPushButton类来创建按钮,并将其添加到自定义对话框中。通过设置按钮的文本、图标和信号槽,您可以实现按钮的功能和交互。 以下是一个简单的示例代码,演示如何在Qt自定义对话框中添加按钮: ```cpp #include <QDialog> #include <QPushButton> #include <QVBoxLayout> class CustomDialog : public QDialog { Q_OBJECT public: CustomDialog(QWidget *parent = nullptr) : QDialog(parent) { // 创建按钮 QPushButton *okButton = new QPushButton("OK", this); QPushButton *cancelButton = new QPushButton("Cancel", this); // 创建布局 QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(okButton); layout->addWidget(cancelButton); // 连接按钮的信号槽 connect(okButton, &QPushButton::clicked, this, &CustomDialog::onOkClicked); connect(cancelButton, &QPushButton::clicked, this, &CustomDialog::onCancelClicked); } signals: void okClicked(); void cancelClicked(); private slots: void onOkClicked() { emit okClicked(); close(); } void onCancelClicked() { emit cancelClicked(); close(); } }; ``` 在这个示例中,我们创建了一个名为CustomDialog的自定义对话框类。在构造函数中,我们创建了两个按钮(OK和Cancel),并将它们添加到垂直布局中。然后,我们连接了按钮的clicked信号到对应的槽函数,以便在按钮被点击时执行相应的操作。 您可以根据需要自定义按钮的样式、位置和功能。希望这个示例能够帮助您理解如何在Qt自定义对话框中添加按钮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值