您的当前位置:首页正文

Qt QPushButton背景图片

2024-12-01 来源:个人技术集锦
一、问题

使用控件显示图片缩略图,当点击控件时,弹出窗口显示完整的图片

二、分析

应该用按钮控件,用信号槽连接。按钮控件是有参数icon,但是只能显示控件中,不能覆盖在整个控件上。

三、方法一:使用styleSheet
1、代码段
QString imgPathStr = ":/images/Qt.png"; // 背景图片文件路径
QString styleSheet = QString("QPushButton{border-image: url(%1);}").arg(imgPathStr);       
QPushButton *btn = new QPushButton(this);    
btn->setStyleSheet(styleSheet);
QImage img(imgPathStr);    
int w = img.width();    
int h = img.height();  // 图片宽高等比例缩放
int maxSide = 100;     // 调整图片中宽高最大者至maxSide    
if(w >= h){        
    double scale = maxSide / double(w);        
    w = maxSide;        
    h *= scale;    
}else{        
    double scale = maxSide / double(h);        
    h = maxSide;        
    w *= scale;    
}    
btn->setFixedSize(w,h);
2、效果图

3、 注意

控件适合自己所要大小,对图片进行长宽等比缩放计算,得到最终长宽,将控件设为固定长宽。

四、 方法二:继承QPushButton重写paintEvent
1、代码段
// 继承QPushButton重写paintEvent
class ImageButton : public QPushButton{
public:    
	ImageButton(QWidget *parent = 0):QPushButton(parent){ 
	
    }    
	void setImage(QPixmap pixMap){        
	    _pixMap = pixMap;       
	    setFixedSize(_pixMap.size());    
   	}
protected:    
	void paintEvent(QPaintEvent* event){        
	    QPainter painter(this);        
	    painter.drawPixmap(rect(), _pixMap);    
	}
private:   
	QPixmap _pixMap;
};

// 调用
QString imgPathStr = ":/images/Qt.png"; // 背景图片文件路径
QImage img(imgPathStr);
QImage scaledImg = img.scaled(100,100,Qt::KeepAspectRatio,Qt::SmoothTransformation);
ImageButton *btn = new ImageButton(this);
btn->setImage(QPixmap::fromImage(scaledImg));
五、附加

前面主要讲了图片如何在QPushButton上显示,至于点击后显示完整图片就很简单了。

1、代码段
connect(btn,&QPushButton::clicked,this,[=](){
        QDialog dlg(this);
        QHBoxLayout *hLay = new QHBoxLayout(&dlg);
        QLabel *label = new QLabel(&dlg);
        label->setPixmap(QPixmap::fromImage(img));
        hLay->addWidget(label);
        dlg.exec();
    });
2、注意

这里用了匿名函数,也可以将匿名函数函数体提取然后做些修改创建成槽函数

对你有用就点个赞?,以后需要用到就收藏⭐

显示全文