Qt自定义图片按钮并设置方向

来源:互联网 发布:java访问次数 编辑:程序博客网 时间:2024/05/22 08:15

Qt自定义图片按钮,设置方向

  虽然Qt定义了很多很多控件,但是还是不能满足用户的需要,比如如果想使用ToolButton,需要带文字,又需要文字可以设定位置,显然就不行了。下面的代码就是一个简单的实现ToolButton功能,并且能够设置图片的位置。
  运行截图如下:
运行截图

  下面是代码部分:

基本定义

// BaseDefine.henum class WIDGET_DIRECTION{    WD_EAST,    WD_SOUTH,    WD_WEST,    WD_NORTH};

头文件

// ImageButton.h#ifndef IMAGEBUTTON_H#define IMAGEBUTTON_H#include <QLabel>#include <QWidget>#include <QHBoxLayout>#include <QVBoxLayout>#include "BaseDefine.h"// 图片按钮类class ImageButton : public QWidget{    Q_OBJECTpublic:    // 设置按钮的图片大小,如果不设置默认大小是50*50    static void SetImageSize(int w, int h)    {        mnWidth = w, mnHeight = h;    }    // 构造函数    ImageButton(QString text,            const char* imagePath,            WIDGET_DIRECTION imageDirection = WIDGET_DIRECTION::WD_NORTH,                QWidget *parent = NULL);private:    // 设置图片文本内容    void SetText(QString text);    // 设置按钮图片    void SetImage(const char *imagePath);protected:    // 重定义鼠标点击事件,只接受当前按钮内的点击和释放    void mousePressEvent(QMouseEvent *event);    void mouseReleaseEvent(QMouseEvent *event);signals:    // 点击信号    void Clicked();private:    // 设定的图片宽度和高度    static int mnWidth;    static int mnHeight;    // 承载图片和文字    QLabel* mLblImage;    QLabel* mLblText;    // 用于Label的布局,使呈现各种方位    QVBoxLayout* mLytBtnV;    QHBoxLayout* mLytBtnH;};#endif // IMAGEBUTTON_H

源文件实现

#include "ImageButton.h"#include <QPixmap>#include <QMouseEvent>// 初始化默认值int ImageButton::mnWidth = 50;int ImageButton::mnHeight = 50;// 构造ImageButton::ImageButton(QString text,                         const char *imagePath,                         WIDGET_DIRECTION imageDirection,                         QWidget *parent)    :QWidget(parent){    // 构造并设置    mLytBtnH = NULL;    mLytBtnV = NULL;    mLblImage = new QLabel(this);    SetImage(imagePath);    mLblText = new QLabel(this);    SetText(text);    mLblText->setScaledContents(true);    // 判断图片位置,并设定    switch (imageDirection) {    case WIDGET_DIRECTION::WD_EAST:        mLytBtnH = new QHBoxLayout(this);        mLytBtnH->addWidget(mLblText);        mLblText->setAlignment(Qt::AlignRight | Qt::AlignVCenter);        mLblText->setMinimumHeight(mLblImage->height());        mLytBtnH->addWidget(mLblImage);        break;    case WIDGET_DIRECTION::WD_SOUTH:        mLytBtnV = new QVBoxLayout(this);        mLytBtnV->addWidget(mLblText);        mLytBtnV->addWidget(mLblImage);        break;    case WIDGET_DIRECTION::WD_WEST:        mLytBtnH = new QHBoxLayout(this);        mLytBtnH->addWidget(mLblImage);        mLytBtnH->addWidget(mLblText);        mLblText->setAlignment(Qt::AlignVCenter);        mLblText->setMinimumHeight(mLblImage->height());        break;    case WIDGET_DIRECTION::WD_NORTH:        mLytBtnV = new QVBoxLayout(this);        mLytBtnV->addWidget(mLblImage);        mLytBtnV->addWidget(mLblText);        break;    default:        break;    }    // 设置本控件内部的间隔为0    if (mLytBtnV != NULL)    {        mLytBtnV->setContentsMargins(0,0,0,0);        mLytBtnV->setSpacing(0);    }    else    {        mLytBtnH->setContentsMargins(0,0,0,0);        mLytBtnH->setSpacing(0);    }}// 设置图片,并缩放void ImageButton::SetImage(const char *imagePath){    QPixmap pix(imagePath);    QPixmap newPix = pix.scaled(mnWidth,mnHeight,Qt::KeepAspectRatio);    mLblImage->setMaximumSize(mnWidth,mnHeight);    mLblImage->setPixmap(newPix);}// 设置按钮文本void ImageButton::SetText(QString text){    mLblText->setText(text);}// 鼠标左键按下事件void ImageButton::mousePressEvent(QMouseEvent *event){    if (event->button() == Qt::LeftButton)    {        // 可以添加你自己定义的其他事件,比如被选中,或者恢复颜色     }}// 鼠标左键弹起事件void ImageButton::mouseReleaseEvent(QMouseEvent *event){    if (event->button() == Qt::LeftButton)    {        // 可以添加你自己定义的其他事件,比如被选中,或者恢复颜色         emit Clicked();    }}

  这样就可以直接使用该控件了,在使用时可以根据需要灵活变换位置;本文没有列出其他的功能,如按钮样式的设置及其他的复杂功能,你可以自行设计。

原文出处:http://blog.csdn.net/motou263514/article/details/78075974

原创粉丝点击