• QT-QT button以及label实现不规则图形(五种方法:使用QSS,设置Mask图片,自己画)


    .h

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3 
     4 #include <QMainWindow>
     5 #include <QWebEngineView>
     6 #include "qlayout.h"
     7 #include "qpushbutton.h"
     8 #include "QMouseEvent"
     9 
    10 QT_BEGIN_NAMESPACE
    11 namespace Ui { class MainWindow; }
    12 QT_END_NAMESPACE
    13 
    14 class CMyButton;
    15 
    16 class MainWindow : public QMainWindow
    17 {
    18     Q_OBJECT
    19 
    20 public:
    21     MainWindow(QWidget *parent = nullptr);
    22     ~MainWindow();
    23 
    24     QWebEngineView    *view;
    25     QHBoxLayout *hl;
    26     QPushButton *m_bu;
    27 private slots:
    28     void on_bu();
    29 private:
    30     char* setstr(char *s);
    31 private:
    32     Ui::MainWindow *ui;
    33     QPixmap pixmapToShow;
    34     QPixmap pixmapToShow2;
    35     QPixmap pixmapToShow3;
    36 };
    37 
    38 class CImageButton : public QPushButton
    39 {
    40     Q_OBJECT
    41 
    42 public:
    43     CImageButton(QWidget *parent);
    44     ~CImageButton();
    45     void SetPixmap(QPixmap* pNormal,QPixmap* pHover,QPixmap* pLighted);
    46     void SetLighted(bool value);
    47 public:
    48     void paintEvent(QPaintEvent* pEvent);
    49     void mousePressEvent(QMouseEvent *e);
    50     void mouseReleaseEvent(QMouseEvent *e);
    51     void enterEvent(QEvent *e);
    52     void leaveEvent(QEvent *e);
    53 protected:
    54     bool m_bLighted;
    55     bool m_bMouseIN;
    56     bool m_bLeftDown;
    57     QPixmap* m_pHover;
    58     QPixmap* m_pNormal;
    59     QPixmap* m_pLighted;
    60 };
    61 
    62 class CMyButton : public QPushButton
    63 {
    64 public:
    65     CMyButton(QWidget *parent);
    66     ~CMyButton();
    67 public:
    68     void paintEvent(QPaintEvent *pEvent) override;
    69 
    70 };
    71 
    72 
    73 #endif // MAINWINDOW_H
    View Code

    .cpp

      1 #include "mainwindow.h"
      2 #include "ui_mainwindow.h"
      3 #include "qdialog.h"
      4 #include "qdir.h"
      5 #include "qlabel.h"
      6 #include "qbitmap.h"
      7 #include "tchar.h"
      8 
      9 
     10 
     11 MainWindow::MainWindow(QWidget *parent)
     12     : QMainWindow(parent)
     13     , ui(new Ui::MainWindow)
     14 {
     15     ui->setupUi(this);
     16 
     17     //水平布局
     18     hl = new QHBoxLayout;
     19     QPixmap pixmap(":/new/a/im/1.png");
     20     QPixmap pixmap2(":/new/a/im/A1.bmp");
     21     QPushButton *m_pPushButton = new QPushButton;
     22     //Qt设置QPushButton文字加图片
     23     //https://blog.csdn.net/wzz953200463/article/details/100637126
     24     //方法一:
     25     //m_pPushButton->setStyleSheet("qproperty-icon: url(C:/Users/zhujq-a/Desktop/QT/2/untitled/im/1.png);");
     26     //m_pPushButton->setText("清理");
     27     //方法二:
     28     //m_pPushButton->setIcon(QPixmap("C:/Users/zhujq-a/Desktop/QT/2/untitled/im/1.png"));
     29     //m_pPushButton->setText("清理");
     30 
     31     //QT中setMask()的图片设置
     32     /**************************************************/
     33     //https://blog.csdn.net/qq_35674193/article/details/79329954
     34     //首先设置一张主图,就是你要显示的图片,然后准备一张遮掩图,用QBitmap类型,
     35     //遮掩图中
     36     //1.黑色区域表示显示的部分,
     37     //2.白色区域表示不显示部分
     38     /**************************************************/
     39     //QT button以及label实现不规则图形(五种方法:使用QSS,设置Mask图片,自己画)
     40     //方法1:
     41     //m_pPushButton->setStyleSheet("QPushButton{border:0px;}");//这句务必加上,否则看到的就是矩形了,而不是不规则图形了
     42     //m_pPushButton->setText("中文");
     43     //m_pPushButton->setIcon(QPixmap(":/new/a/im/1.png"));
     44     //m_pPushButton->setIconSize(QPixmap(":/new/a/im/1.png").size());
     45     //m_pPushButton->resize(QPixmap("::/new/a/im/1.png").size());
     46     //可以显示不规则图片,但是没有鼠标经过,按下效果。
     47     //PS:图片在左,文字在右。
     48     //方法2:
     49     //m_pPushButton->setFixedSize(QPixmap(":/new/a/im/1.png").size());
     50     //m_pPushButton->setStyleSheet("border-image:url(:/new/a/im/1.png)");
     51     //m_pPushButton->setText("中文");
     52     //可以显示不规则图片,但是没有鼠标经过,按下效果。
     53     //PS:图片、文字重叠。
     54     //方法3:
     55     //m_pPushButton->setFixedSize(QPixmap(":/new/a/im/1.png").size());
     56     //m_pPushButton->setIcon(QPixmap(":/new/a/im/1.png"));
     57     //m_pPushButton->setIconSize(QPixmap(":/new/a/im/1.png").size());
     58     //m_pPushButton->setMask(QPixmap(":/new/a/im/1.png").createHeuristicMask());
     59     //m_pPushButton->setMask(QPixmap(":/new/a/im/A1.png"));
     60     //不过该方法效果并不好,能看到button的边缘有锯齿,createHeuristicMask换成mask也是一样。
     61     //方法4:
     62     //或着m_pPushButton->setIcon(QPixmap("C:/Users/zhujq-a/Desktop/QT/2/untitled/im/1.png"));
     63     //m_pPushButton->setIcon(QIcon(":/new/a/im/1.png"));
     64     //m_pPushButton->setIconSize(QPixmap(":/new/a/im/1.png").size());
     65     //m_pPushButton->setMask(pixmap2);
     66     //m_pPushButton->setFixedSize(600, 700);//因为是隐去其他区域,所以只会显示图片中的内容大小。
     67     //方法5:继承qpushButton,重写paintevent,在里面可以设置mask或者通过qpainterPath自己构造不规则轮廓,代码如下:
     68     //QPushButton *m_pMyButton = new CMyButton(this);
     69     //connect(m_pMyButton, &QPushButton::clicked, this, &MainWindow::on_bu);
     70     //hl->addWidget(m_pMyButton);
     71     //联接测试事件
     72     //connect(m_pPushButton, &QPushButton::clicked, this, &MainWindow::on_bu);
     73     //向布局增加按钮
     74     //hl->addWidget(m_pPushButton);
     75 
     76     //Lable显示图片方式
     77     //方法6:
     78     //QLabel * m_pLabel = new QLabel;
     79     //m_pLabel->setFixedSize(QPixmap(":/new/a/im/1.png").size());
     80     //m_pLabel->setScaledContents(true);
     81     //m_pLabel->setPixmap(QPixmap(":/new/a/im/1.png"));//可以保证图片不失真
     82     //m_pLabel->setPixmap(QPixmap(":/new/a/im/1.png").scaled(40,40));//可以看到label的边缘有锯齿
     83     //hl->addWidget(m_pLabel);
     84     //方法7:
     85     //QLabel *label1 = new QLabel;
     86     //QImage *image = new QImage;
     87     //image->load(":/new/a/im/1.png");
     88     //label1->setPixmap(pixmap);
     89     //hl->addWidget(label1);
     90     //方法8
     91     //QLabel *label1 = new QLabel;
     92     //QImage *image = new QImage;
     93     //image->load(":/new/a/im/1.png");
     94     //QImage *imgScaled = new QImage;
     95     //*imgScaled = image->scaled(600, 500, Qt::KeepAspectRatio);
     96     //label1->setPixmap(QPixmap::fromImage(*imgScaled));
     97     //hl->addWidget(label1);
     98     //会显示的十分大,不过会有失真情。
     99     //方法8是在方法5的基础上绘制画片
    100     //QImage *image = new QImage;
    101     //image->load(":/new/a/im/1.png");
    102     //需要在.h文件中定义“QPixmap pixmapToShow;”,要不然绘制时提示图片不存在。
    103     //pixmapToShow = QPixmap::fromImage(*image);
    104     //QImage *image2 = new QImage;
    105     //image2->load(":/new/a/im/2.png" );
    106     //pixmapToShow2 = QPixmap::fromImage(*image2);//&QPixmap::fromImage(image2->scaled(size(), Qt::KeepAspectRatio));
    107     //QImage *image3 = new QImage;
    108     //image3->load(":/new/a/im/3.png" );
    109     //pixmapToShow3 = QPixmap::fromImage(*image3);//QPixmap::fromImage(image3->scaled(size(), Qt::KeepAspectRatio));
    110     //CImageButton* m_pOrderAbove = new CImageButton(this);
    111     //m_pOrderAbove->setFixedSize(100, 100);
    112     //m_pOrderAbove->SetPixmap(&pixmapToShow, &pixmapToShow2, &pixmapToShow3);
    113     //m_pOrderAbove->setText(QString::fromLocal8Bit("123as"));
    114     //m_pOrderAbove->setStyleSheet("color: rgb(0, 0, 0);");//"color: rgb(255, 255, 255);"
    115     //m_pOrderAbove->setGeometry(144, 0, pixmapToShow.width(), pixmapToShow.height());
    116     //connect(m_pOrderAbove, &QPushButton::clicked, this, &MainWindow::on_bu);
    117     //hl->addWidget(m_pOrderAbove);
    118     //有鼠标进入、移出、按下效果,不过绘的字和图片重叠了,而且进入事件是按钮的大小,不是图片实现大小。
    119 
    120 
    121     char strings[] = "abc";
    122     char *str = strings;
    123     setstr(str);
    124     qDebug() << str;
    125 
    126 
    127 //    view = new QWebEngineView(this);
    128 //        connect(view, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
    129 //        view->load(QUrl(QDir::currentPath() + "123.html"));
    130 //        view->show();
    131 //    view->load(QUrl(QStringLiteral("C:/123.html")));
    132 //    view->setContentsMargins(0,0,0,0);
    133 //    view->showMaximized();
    134 //    hl->addWidget(view);
    135     ui->centralwidget->setLayout(hl);
    136 }
    137 
    138 
    139 
    140 MainWindow::~MainWindow()
    141 {
    142     delete ui;
    143 }
    144 
    145 void MainWindow::on_bu()
    146 {
    147     QDialog *odia = new QDialog;
    148     QHBoxLayout *ohb = new QHBoxLayout;
    149     QPushButton *obu = new QPushButton;
    150     obu->setText("OK");
    151     ohb->addWidget(obu);
    152     odia->setLayout(ohb);
    153     odia->show();
    154 }
    155 
    156 void MainWindow::setstr(char *s)
    157 {
    158      QString str1;
    159      for (int i = strlen(s)-1; i>=0; i--)
    160      {
    161          qDebug() << s[i];
    162          str1 = str1 + s[i];
    163      }
    164 //     char* p = new char[3];
    165 
    166 //     memset(p, '', strlen(p));
    167      memcpy(s, str1.toStdString().c_str(), 3);
    168 //     qDebug() << p;
    169 //     qDebug() << strlen(p);
    170 //     return p;
    171 
    172 }
    173 
    174 
    175 CImageButton::CImageButton(QWidget *parent)
    176     :QPushButton(parent),
    177     m_bMouseIN(false),
    178     m_bLeftDown(false),
    179     m_bLighted(false)
    180 {
    181 
    182 }
    183 
    184 CImageButton::~CImageButton()
    185 {
    186 
    187 }
    188 
    189 void CImageButton::SetPixmap(QPixmap *pNormal, QPixmap *pHover, QPixmap *pLighted)
    190 {
    191     m_pNormal=pNormal;
    192     m_pHover=pHover;
    193     m_pLighted=pLighted;
    194 }
    195 
    196 void CImageButton::SetLighted(bool value)
    197 {
    198     if(value != m_bLighted)
    199     {
    200         m_bLighted=value;
    201         repaint();
    202     }
    203 }
    204 
    205 void CImageButton::paintEvent(QPaintEvent *pEvent)
    206 {
    207     QPixmap* pPixmap;
    208     if(m_bLighted || m_bLeftDown)
    209         pPixmap=m_pLighted;
    210     else
    211     {
    212         if(m_bMouseIN)
    213             pPixmap=m_pHover;
    214         else
    215             pPixmap=m_pNormal;
    216     }
    217     QPainter painter;
    218     painter.begin(this);
    219     if(pPixmap)
    220         painter.drawPixmap(rect(),*pPixmap);
    221     if(text().count() > 0)
    222         painter.drawText(rect(),Qt::AlignCenter,text());
    223     painter.end();
    224 }
    225 
    226 void CImageButton::mousePressEvent(QMouseEvent *e)
    227 {
    228     if(e->button()==Qt::LeftButton)
    229         {
    230             m_bLeftDown=true;
    231             repaint();
    232         }
    233     QPushButton::mousePressEvent(e);
    234 }
    235 
    236 void CImageButton::mouseReleaseEvent(QMouseEvent *e)
    237 {
    238     if(e->button()==Qt::LeftButton)
    239     {
    240         m_bLeftDown=false;
    241         repaint();
    242     }
    243     QPushButton::mouseReleaseEvent(e);
    244 }
    245 
    246 void CImageButton::enterEvent(QEvent *e)
    247 {
    248     m_bMouseIN=true;
    249     repaint();
    250 }
    251 
    252 void CImageButton::leaveEvent(QEvent *e)
    253 {
    254     m_bMouseIN=false;
    255     repaint();
    256 }
    257 
    258 CMyButton::CMyButton(QWidget *parent)
    259     :QPushButton(parent)
    260 {
    261 
    262 }
    263 
    264 CMyButton::~CMyButton()
    265 {
    266 
    267 }
    268 
    269 void CMyButton::paintEvent(QPaintEvent *pEvent)
    270 {
    271     QPainter painter(this); //创建painter
    272     painter.setRenderHint(QPainter::Antialiasing, true); //消除锯齿效果
    273 
    274     //构造painterpath
    275     QPainterPath path;
    276     path.moveTo(0, 0);
    277     path.lineTo(100, 0);
    278     path.lineTo(100/2, 200);
    279     path.lineTo(0, 0);
    280 
    281     //path->setFillRule(Qt::WindingFill);
    282     //设置无画笔,避免边框出现一条黑线
    283     painter.setPen(Qt::NoPen);
    284     //设置画刷
    285     painter.setBrush(QBrush(QColor(36,169,225), Qt::SolidPattern));
    286     //绘制背景
    287     painter.drawPath(path);
    288 
    289     pEvent->accept();//不再向父类传递消息
    290 }
    View Code
  • 相关阅读:
    多表查询,连表查询
    mysql数据概念难点
    mysql练习题
    linux下 redis
    nginx安装
    八皇后问题 OpenJ_Bailian
    Prime Ring Problem hdu-1016 DFS
    Oil Deposits hdu-1241 DFS
    Highways
    畅通工程再续
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/12889401.html
Copyright © 2020-2023  润新知