一券册、實(shí)現(xiàn)效果截圖
二、自定義Widget
1市咽、SkinItem.h 文件
#ifndef SKINITEM_H
#define SKINITEM_H
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
class SkinItem : public QWidget
{
? ? Q_OBJECT
public:
? ? explicit SkinItem(QWidget *parent = nullptr);
? ? ~SkinItem();
? ? //選項(xiàng)是否選中
? ? void setChecked(bool isChecked);
? ? //設(shè)置圖片
? ? void setPixmap(QString icon,QString content);
private:
? ? QLabel *m_pContentLabel;//皮膚名稱
? ? QLabel *m_pCheckLabel;//選中
? ? QPushButton *m_pIconButton;//皮膚圖片
? ? QPushButton *m_pIconlayer;//皮膚圖層
? ? int defwidth,defheight;//寬高
? ? bool ischecked = false;
? ? //圖片樣式
? ? QString style = "QPushButton#SkinItemIcon{"
? ? ? ? ? ? ? ? ? ? "border:none;"
? ? ? ? ? ? ? ? ? ? "background-image:url(%0);"
? ? ? ? ? ? ? ? ? ? "}"
? ? ? ? ? ? ? ? ? ? "QPushButton#SkinItemIcon:checked{"
? ? ? ? ? ? ? ? ? ? "border: 3px solid white;"
? ? ? ? ? ? ? ? ? ? "}";
signals:
? ? void clicked(QString);
};
#endif // SKINITEM_H
2痊银、SkinItem.cpp 文件
#include "SkinItem.h"
SkinItem::SkinItem(QWidget *parent) :
? ? QWidget(parent),
? ? defwidth(118),
? ? defheight(78)
{
? ? //皮膚文本
? ? m_pContentLabel = new QLabel(this);
? ? m_pContentLabel->setObjectName("SkinItemTitle");
? ? m_pContentLabel->setText("皮膚名稱");
? ? m_pContentLabel->setFixedHeight(16);
? ? //圖片
? ? m_pIconButton = new QPushButton(this);
? ? m_pIconButton->setFixedSize(QSize(defwidth,defheight));
? ? m_pIconButton->setObjectName("SkinItemIcon");
? ? m_pIconButton->setCheckable(true);
? ? //圖片圖層
? ? m_pIconlayer = new QPushButton(m_pIconButton);
? ? m_pIconlayer->setFixedSize(QSize(defwidth,defheight));
? ? m_pIconlayer->setObjectName("SkinItemIconlayer");
? ? m_pIconlayer->setCheckable(true);
? ? m_pIconlayer->raise();
? ? //選中控件
? ? m_pCheckLabel = new QLabel(m_pIconlayer);
? ? m_pCheckLabel->setFixedSize(20,20);
? ? m_pCheckLabel->setScaledContents(true);
? ? m_pCheckLabel->setObjectName("SkinItemCheck");
? ? m_pCheckLabel->move(defwidth*0.78,defheight*0.68);
? ? m_pCheckLabel->setVisible(false);
? ? //布局
? ? QVBoxLayout *mainlayout = new QVBoxLayout;
? ? mainlayout->setMargin(0);
? ? mainlayout->setSpacing(0);
? ? mainlayout->addWidget(m_pIconButton,0,Qt::AlignCenter);
? ? mainlayout->addWidget(m_pContentLabel,0,Qt::AlignHCenter);
? ? setLayout(mainlayout);
? ? setFixedSize(QSize(defwidth,112));
? ? //信號(hào)與槽
? ? QObject::connect(m_pIconlayer, &QPushButton::clicked, [this](bool) {
? ? ? ? emit clicked(m_pContentLabel->text().trimmed());
? ? });
}
SkinItem::~SkinItem()
{
}
/**
* 設(shè)置是否選中
* @brief SkinItem::setChecked
* @param isChecked
*/
void SkinItem::setChecked(bool isChecked)
{
? ? m_pIconlayer->setChecked(isChecked);
? ? m_pIconButton->setChecked(isChecked);
? ? m_pCheckLabel->setVisible(isChecked);
}
/**
* 設(shè)置圖片
* @brief SkinItem::setPixmap
* @param icon
*/
void SkinItem::setPixmap(QString icon, QString content)
{
? ? m_pIconButton->setStyleSheet(style.arg(icon));
? ? m_pContentLabel->setText(content);
}
3、使用
? ? QStringList namelist<<"海之夕陽"<<"陽之光芒"<<"櫻花夕陽"<<"未來之途";
? ? QGridLayout *gridlayout = new QGridLayout;
? ? for (uint8_t i=0;i
? ? ? ? SkinItem *skinitem = new SkinItem;
? ? ? ? skinitem->setPixmap(QString(":/image/skin/skin%0.png").arg(i),namelist.at(i));
? ? ? ? itemList.append(skinitem);
? ? ? ? gridlayout->addWidget(skinitem,0,i,1,1);
? ? ? ? if(currentId == i){
? ? ? ? ? ? skinitem->setChecked(true);
? ? ? ? }
? ? ? ? QObject::connect(skinitem,&SkinItem::clicked,[this](QString str){
? ? ? ? ? ? setItemChecked(str);
? ? ? ? });
? ? }
void SkinDialog::setItemChecked(QString str)
{
? ? int index = namelist.indexOf(str);
? ? if(currentId == index){
? ? ? ? return;
? ? }
? ? currentId = index;
? ? for (uint8_t i =0;i
? ? ? ? itemList.at(i)->setChecked(i == index);
? ? }
? ? emit updateskin(index);
}