.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
.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, '\0', 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 }
来源:oschina
链接:https://my.oschina.net/u/4299659/blog/4279805