头文件:

  1. #ifndef GLABEL_H
  2. #define GLABEL_H
  3.  
  4. #include <QLabel>
  5. #include <QPainter>
  6. #include <QPaintEvent>
  7. #include <QMouseEvent>
  8.  
  9. class GLabel : public QLabel
  10. {
  11. Q_OBJECT
  12. public:
  13. enum PEOPLE{She,Me};
  14. Q_PROPERTY(QString str_context READ getStrContext WRITE setContext)
  15. explicit GLabel(QWidget *parent = ,GLabel::PEOPLE f=GLabel::She);
  16. void setContext(const QString s){str_context = s;}
  17. QString getStrContext()const{return str_context;}
  18.  
  19. QString str_context;
  20. QLabel *label_text;
  21. QLabel *label_people;
  22. PEOPLE people;
  23. public:
  24. int m_width;
  25. int m_height;
  26. int parent_maxwidth;
  27.  
  28. void init();
  29. void initUI(GLabel::PEOPLE f);
  30. void setSize(QString&);
  31. void setOurText(QString);
  32. void setHeadpic(QString);
  33. void paintEvent(QPaintEvent *e);
  34. void mousePressEvent(QMouseEvent *e);
  35. //signals:
  36.  
  37. //public slots:
  38.  
  39. };
  40.  
  41. #endif // GLABEL_H

.cpp文件:

  1. #include "glabel.h"
  2. #include <QPen>
  3. #include <QDebug>
  4.  
  5. GLabel::GLabel(QWidget *parent,GLabel::PEOPLE f) :
  6. QLabel(parent)
  7. {
  8. people = f;
  9. parent_maxwidth = ((QWidget*)this->parent())->width();
  10. init();
  11. }
  12.  
  13. void GLabel::init()
  14. {
  15. label_text = new QLabel(this);
  16. label_text->setWordWrap(true);
  17. label_text->setGeometry(+,,this->width()--,this->height()-);
  18. label_text->setStyleSheet("QLabel{background:rgb(173,216,67)}");//rgb(173,216,67)
  19. label_text->show();
  20.  
  21. label_people = new QLabel(this);
  22. if(people == GLabel::She)
  23. {
  24. label_people->setGeometry(,,,);
  25. label_text->setStyleSheet("QLabel{background:rgb(173,216,67)}");
  26. label_people->setPixmap(QPixmap(":/image/she.png"));
  27. }
  28. else
  29. {
  30. label_people->setGeometry(this->width()-,,,);
  31. label_text->setStyleSheet("QLabel{background:rgb(240,240,240)}");
  32. label_people->setPixmap(QPixmap(":/image/he.png"));
  33. }
  34. }
  35.  
  36. void GLabel::initUI(GLabel::PEOPLE f)
  37. {
  38.  
  39. }
  40.  
  41. void GLabel::setSize(QString &paramstr)
  42. {
  43. // int all_word_width = this->fontMetrics().width(paramstr);
  44. // int one_line_height = this->fontMetrics().lineSpacing();
  45. int max_width = parent_maxwidth-;//-label_people->width();
  46. int all_word_width;
  47.  
  48. label_text->setWordWrap(false);
  49. label_text->setText(paramstr);
  50. label_text->adjustSize();
  51. all_word_width = label_text->width();
  52. label_text->setWordWrap(true);
  53.  
  54. float line_count;
  55. int line;
  56.  
  57. if(all_word_width > max_width)
  58. {
  59. // line_count = (float)all_word_width/max_width;
  60. // line = (int)line_count;
  61. // if(line < line_count)line=line+2;
  62. label_text->setMaximumWidth(max_width--);
  63. label_text->setText(paramstr);
  64. label_text->adjustSize();
  65. qDebug()<<"the size of text"<<label_text->size()<<((QWidget*)this->parent())->width()-;
  66.  
  67. m_height = label_text->height()/*line*one_line_height*/;
  68. m_width = parent_maxwidth-;
  69. // qDebug()<<"linr_count"<<line_count<<one_line_height<<max_width<<all_word_width;
  70. this->resize(m_width,m_height+);
  71. }
  72. else
  73. {
  74. label_text->setWordWrap(false);
  75. m_height = ;
  76.  
  77. label_text->setText(paramstr);
  78. label_text->adjustSize();
  79. m_width = label_text->width()++;
  80. //label_text->setMinimumWidth(all_word_width);
  81. this->resize(m_width+,m_height);
  82. }
  83.  
  84. if(people == GLabel::She)
  85. label_text->setGeometry(+,,this->width()--,this->height()-);
  86. else
  87. label_text->setGeometry(,,this->width()--,this->height()-);
  88.  
  89. update();
  90. }
  91.  
  92. void GLabel::setOurText(QString paramstr)
  93. {
  94. setSize(paramstr);
  95. qDebug()<<"setSize"<<this->width()<<this->height();
  96. //label_text->setWordWrap(true);
  97. // label_text->setText(paramstr);
  98. }
  99.  
  100. void GLabel::mousePressEvent(QMouseEvent *e)
  101. {
  102. qDebug()<<"this pos is"<<e->pos();
  103. }
  104.  
  105. void GLabel::setHeadpic(QString dir)
  106. {
  107. label_people->setPixmap(QPixmap(dir));
  108. }
  109.  
  110. void GLabel::paintEvent(QPaintEvent *e)
  111. {
  112. //QPainter painter(this);
  113. if(people == GLabel::She)
  114. {
  115. QRectF rectangle(50.0, 10.0, this->width()--, this->height()-);
  116.  
  117. QPainter painter(this);
  118. painter.setRenderHint( QPainter::Antialiasing, true );
  119. painter.setBrush(QBrush(QColor(,,)));
  120. painter.drawRoundedRect(rectangle,,);
  121.  
  122. QPointF points[] = {
  123. QPointF(, ),
  124. QPointF(, ),
  125. QPointF(, ),
  126. };
  127.  
  128. QPen pen;
  129. pen.setColor(QColor(,,));
  130. painter.setPen(pen);
  131. painter.drawPolygon(points, );
  132.  
  133. QPen pen1;
  134. pen.setColor(Qt::black);
  135. painter.setPen(pen1);
  136. painter.drawLine(points[],points[]);
  137. painter.drawLine(points[],points[]);
  138. }
  139. else if(people == GLabel::Me)
  140. {
  141. QRectF rectangle(10.0, 10.0, this->width()--, this->height()-);
  142.  
  143. QPainter painter(this);
  144. painter.setRenderHint( QPainter::Antialiasing, true );
  145. painter.setBrush(QBrush(QColor(,,)));
  146. painter.drawRoundedRect(rectangle,,);
  147.  
  148. QPointF points[] = {
  149. QPointF(this->width()-, ),
  150. QPointF(this->width()-, ),
  151. QPointF(this->width()-,),
  152. };
  153.  
  154. QPen pen;
  155. pen.setColor(QColor(,,));
  156. painter.setPen(pen);
  157. painter.drawPolygon(points, );
  158.  
  159. QPen pen1;
  160. pen.setColor(Qt::black);
  161. painter.setPen(pen1);
  162. painter.drawLine(points[],points[]);
  163. painter.drawLine(points[],points[]);
  164.  
  165. // label_text->setGeometry(20,20,this->width()-40-30,this->height()-40);
  166. label_people->setGeometry(this->width()-,,,);
  167. this->setGeometry(((QWidget*)this->parent())->width()--this->width(),this->y(),this->width(),this->height());
  168. }
  169. // qDebug()<<"this size of pix"<<label_people->size();
  170. // drawShe();
  171. }

实际调用:

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. #include <QDebug>
  4.  
  5. Dialog::Dialog(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::Dialog)
  8. {
  9. ui->setupUi(this);
  10.  
  11. label[] = new GLabel(this,GLabel::Me);
  12. label[]->setGeometry(,,,);
  13. label[]->setOurText(tr("你好!"));
  14. label[]->show();
  15.  
  16. label[] = new GLabel(this,GLabel::She);
  17. label[]->setGeometry(,label[]->y()+label[]->height(),,);
  18. label[]->setOurText(tr("你好!"));
  19. label[]->show();
  20.  
  21. label[] = new GLabel(this,GLabel::Me);
  22. label[]->setGeometry(,label[]->y()+label[]->height(),,);
  23. label[]->setOurText(tr("我们好像在哪里见过?"));
  24. label[]->show();
  25.  
  26. label[] = new GLabel(this,GLabel::She);
  27. label[]->setGeometry(,label[]->y()+label[]->height(),,);
  28. label[]->setOurText(tr("?"));
  29. label[]->show();
  30.  
  31. label[] = new GLabel(this,GLabel::Me);
  32. label[]->setGeometry(,label[]->y()+label[]->height(),,);
  33. label[]->setOurText(tr("我们好像在哪见过你记得吗?好像那是一个秋天夕阳西下,你美得让我不敢和你说话,你经过我时风起浮动我的发"));
  34. label[]->show();
  35.  
  36. label[] = new GLabel(this,GLabel::She);
  37. label[]->setGeometry(,label[]->y()+label[]->height(),,);
  38. label[]->setOurText(tr("银杏还是会黄的,雪也会再次染白整个世界。安好"));
  39. label[]->show();
  40. }
  41.  
  42. Dialog::~Dialog()
  43. {
  44. delete ui;
  45. }

下载:http://download.csdn.net/download/yangkping123/8620775

聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标的更多相关文章

  1. 在Microsoft Expression Blend 2 中绘制圆角矩形按钮

    原文:在Microsoft Expression Blend 2 中绘制圆角矩形按钮 /* 声明:转载请保留此信息:http://www.BrawDraw.com, http://www.ZPXP.c ...

  2. canva绘制圆角矩形

    在做组态的时候,需要支持矩形圆角格式,但是因为canvas本身不带有圆角矩形,需要自行算出坐标进行绘制 方案一.统一圆角 <!DOCTYPE html> <html> < ...

  3. Android中绘制圆角矩形图片及任意形状图片

    圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子: 下面在Android中实现将普通的矩形图片绘制成圆角 ...

  4. Delphi中绘制圆角矩形的窗体

    制作圆角矩形的窗体: 01.procedure TPortForm.FormCreate(Sender: Tobject); 02.var hr :thandle; 03.begin 04.hr:=c ...

  5. C# 绘制圆角矩形

    Graphics g = e.Graphics; // 圆角半径 ; // 要实现 圆角化的 矩形 Rectangle rect = , , panel4.Width - cRadius, panel ...

  6. Cocos2d-x绘制圆角矩形

    /* * @brief 画圆角矩形 * @param origin 矩形开始点 * @param destination 矩形结束点 * @param radius 圆角半径 * @param seg ...

  7. canvas 绘制圆角矩形

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

  8. 使用Draw rect 绘制圆角矩形

    - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPush ...

  9. C#绘制三角形并填充,使用winform实现qq聊天气泡

    首先是需求,需要制作一个聊天气泡, 但是winform中有没有类似Android的.9图,只有自己设计图形拼接气泡. 第一种是绘制空心三角形,第二种是绘制三角形区域,可以指定RGB颜色. privat ...

随机推荐

  1. Android:AysncTask异步加载

    以下是链接: http://blog.csdn.net/abc5382334/article/details/17097633 http://keeponmoving.iteye.com/blog/1 ...

  2. CentOS 安装easy_install、pip的方法

    CentOS 安装easy_install的方法: wget -q http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py ...

  3. Windows Phone 8初学者开发—第17部分:Coding4Fun工具包简介

    原文 Windows Phone 8初学者开发—第17部分:Coding4Fun工具包简介 第17部分:Coding4Fun工具包简介 原文地址:  http://channel9.msdn.com/ ...

  4. 【细说Java】揭开Java的main方法神秘的面纱(转)

    大家都知道,main方法是Java应用程序的入口,其定义格式为: public static void main(String[] args) 可是为什么要这么定义呢?不这样定义可以么?main方法可 ...

  5. Android大放送干:书籍、过程、工具等各种全

    完全干燥分享,本文收集Android制定必要的书籍.过程.具.新闻和杂志各种资源.它们能让你在Android开发之旅的各个阶段都受益. 入门 <Learning Android(中文版)> ...

  6. uva 816 - Abbott&#39;s Revenge(有点困难bfs迷宫称号)

    是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...

  7. WinForm - 格式化DataGridView单元格数据

    效果: 代码: /// <summary> /// 格式化数据 /// </summary> private void dataGridView1_CellFormatting ...

  8. BZOJ 3438: 小M的作物( 最小割 )

    orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...

  9. 修改linux文件权限命令:chmod 【转载】

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. chmod  命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod ...

  10. switch的方便用法

    int ch = getch(); switch(ch) { case '0' ... '9': if (in_count) { count = count * 10 + (ch - '0'); } ...