Qt绘制圆形按钮

https://blog.csdn.net/xialianggang1314/article/details/81328577

关于Qt下绘制按钮的文章不少,这里简单介绍一个怎么绘制圆形⭕️的按钮并在点击时候改变颜色的方法。先上图,如下:

==》1 圆形按钮初始状态(未被点击且鼠标未移动到按钮上)

   

==》2 当鼠标移动到按钮上时的状态

==》3、点击圆形按钮时的状态

 

其他的不多说了,直接上代码吧,具体细节请代码中的注释信息:


 
 
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include"QPainter"
  5. class QPainter;
  6. class QMouseEvent;
  7. class QRectF;
  8. class MainWindow : public QMainWindow
  9. {
  10. Q_OBJECT
  11. public:
  12. MainWindow(QWidget *parent = 0);
  13. ~MainWindow();
  14. signals:
  15. void cursorchanged(QPaintEvent *event);
  16. public:
  17. void paintEvent(QPaintEvent *); //绘图
  18. void mousePressEvent(QMouseEvent *event);
  19. void mouseReleaseEvent(QMouseEvent* event);
  20. void mouseMoveEvent(QMouseEvent *); //鼠标移动事件==》可以用于做触摸式的动作
  21. public:
  22. QPaintEvent *m_paintevent;
  23. QPainter painter;
  24. int m_pressflag; //判断按钮是否被点击
  25. int m_touchflag; //鼠标滑动到按钮上
  26. QRectF rectbutton; //圆形按钮的外接矩形
  27. };
  28. #endif // MAINWINDOW_H

 
 
  1. #include "mainwindow.h"
  2. #include"QPainter"
  3. #include"QMouseEvent"
  4. #include"QRectF"
  5. #include"QDebug"
  6. MainWindow::MainWindow(QWidget *parent)
  7. : QMainWindow(parent)
  8. {
  9. this->setFixedSize( 500, 500); //设置父窗口的大小
  10. m_pressflag = false;
  11. m_touchflag = false;
  12. rectbutton = QRectF( 20, 20, 50, 50);
  13. setMouseTracking( true); //设置鼠标可跟踪
  14. connect( this,SIGNAL(cursorchanged(QPaintEvent* )), this,SLOT(paintEvent(QPaintEvent*)));
  15. }
  16. MainWindow::~MainWindow()
  17. {
  18. }
  19. //绘图事件
  20. void MainWindow::paintEvent(QPaintEvent *)
  21. {
  22. painter.begin( this);
  23. painter.setPen(QPen(Qt::blue, 4)); //设置画笔形式
  24. if(!m_pressflag && !m_touchflag){
  25. painter.drawEllipse(rectbutton); //画圆形状按钮==>矩形的内切圆
  26. }
  27. else if(m_pressflag)
  28. {
  29. painter.setBrush(Qt::red);
  30. }
  31. else if (!m_pressflag && m_touchflag)
  32. {
  33. //painter.begin(this);
  34. painter.setBrush(Qt::black);
  35. }
  36. painter.drawEllipse(rectbutton);
  37. painter.end();
  38. update();
  39. }
  40. //鼠标点击事件
  41. void MainWindow::mousePressEvent(QMouseEvent *event)
  42. {
  43. if(rectbutton.contains(event->pos())){
  44. qDebug()<< "buttton was clicked!";
  45. m_pressflag = !m_pressflag;
  46. }
  47. }
  48. //鼠标释放事件
  49. void MainWindow::mouseReleaseEvent(QMouseEvent* event)
  50. {
  51. }
  52. //鼠标移动事件
  53. void MainWindow::mouseMoveEvent(QMouseEvent *event)
  54. { //鼠标移动事件==》可以用于做触摸式的动作
  55. QPoint n = event->pos();
  56. qDebug()<<n; //鼠标移动位置
  57. if(rectbutton.contains(n))
  58. {
  59. qDebug()<< "button was touched";
  60. m_touchflag = true;
  61. }
  62. else
  63. {
  64. m_touchflag = false;
  65. }
  66. emit cursorchanged(m_paintevent); //这个地方的信号函数的用法新手请注意,老司机请忽略
  67. qDebug()<< "signal was emitted";
  68. }

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值