Qt Widget封装左图标右文本的图片按钮 IconButton

这里写图片描述

如上图所示,受移动端界面设计的影响,pc客户端上的界面设计也越来越多的出现类似的界面,传统的QPushButton和QToolButton,无论是添加image还是添加icon,都无法满足这样的UI设计需求,退而求其次,只能用QWidget自行封装。

封装的基本思路是以QPushButton为父widget,上面添加水平布局layout,然后再放两个QLabel,左边用于显示图片,右边用于显示文本,然后重载一些函数,让封装之后的button在使用上和传统的QPushButton没有任何区别。

部分代码如下:

#ifndef ICONBUTTON_H
#define ICONBUTTON_H

#include <QPushButton>

class QLabel;
class IconButton : public QPushButton
{
    Q_OBJECT
public:
    IconButton(QWidget* parent=nullptr);
    ~IconButton();
    void setText(const QString &text);
    void setIconImg(const QString &imgFile);

private:
    QLabel* label_icon;
    QLabel* label_text;
};

#endif // ICONBUTTON_H
#include "IconButton.h"
#include <QHBoxLayout>
#include <QLabel>

IconButton::IconButton(QWidget* parent)
    : QPushButton(parent)
{
    QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth());
    this->setSizePolicy(sizePolicy);

    QHBoxLayout* horizontalLayout = new QHBoxLayout(this);
    horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));

    label_icon = new QLabel(this);
    label_icon->setObjectName(QStringLiteral("label_icon"));
    horizontalLayout->addWidget(label_icon);

    label_text = new QLabel(this);
    label_text->setObjectName(QStringLiteral("label_text"));

    horizontalLayout->addWidget(label_text);

    //设置图像占位和文字占位1:3
    horizontalLayout->setStretch(0, 1);
    horizontalLayout->setStretch(1, 3);
}
void IconButton::setText(const QString &text)
{
    label_text->setText(text);
}
void IconButton::setIconImg(const QString &imgFile)
{
    label_icon->setStyleSheet("#label_icon {background-position:center;   
    background-repeat:no_repeat; background-image: url(:/res/"+imgFile+");}");
}
IconButon::~IconButton()
{
}

用代码创建界面时调用如下:

void Dialog::addIconButton()
{
    IconButton *btn1 = new IconButton(this);
    btn1->setText("ABC");
    btn1->setIconImg("shutdown.png");
    ui->verticalLayout->addWidget(btn1);
}

也可以现在UI文件上摆放QPushButton后再进行提升。

在实际的Qt Widget开发中,界面封装的思路大概就是这样,任何复杂的界面都可以通过用QWidget和相应的layout来进行封装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值