聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标
头文件:
#ifndef GLABEL_H
#define GLABEL_H #include <QLabel>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent> class GLabel : public QLabel
{
Q_OBJECT
public:
enum PEOPLE{She,Me};
Q_PROPERTY(QString str_context READ getStrContext WRITE setContext)
explicit GLabel(QWidget *parent = ,GLabel::PEOPLE f=GLabel::She);
void setContext(const QString s){str_context = s;}
QString getStrContext()const{return str_context;} QString str_context;
QLabel *label_text;
QLabel *label_people;
PEOPLE people;
public:
int m_width;
int m_height;
int parent_maxwidth; void init();
void initUI(GLabel::PEOPLE f);
void setSize(QString&);
void setOurText(QString);
void setHeadpic(QString);
void paintEvent(QPaintEvent *e);
void mousePressEvent(QMouseEvent *e);
//signals: //public slots: }; #endif // GLABEL_H
.cpp文件:
#include "glabel.h"
#include <QPen>
#include <QDebug> GLabel::GLabel(QWidget *parent,GLabel::PEOPLE f) :
QLabel(parent)
{
people = f;
parent_maxwidth = ((QWidget*)this->parent())->width();
init();
} void GLabel::init()
{
label_text = new QLabel(this);
label_text->setWordWrap(true);
label_text->setGeometry(+,,this->width()--,this->height()-);
label_text->setStyleSheet("QLabel{background:rgb(173,216,67)}");//rgb(173,216,67)
label_text->show(); label_people = new QLabel(this);
if(people == GLabel::She)
{
label_people->setGeometry(,,,);
label_text->setStyleSheet("QLabel{background:rgb(173,216,67)}");
label_people->setPixmap(QPixmap(":/image/she.png"));
}
else
{
label_people->setGeometry(this->width()-,,,);
label_text->setStyleSheet("QLabel{background:rgb(240,240,240)}");
label_people->setPixmap(QPixmap(":/image/he.png"));
}
} void GLabel::initUI(GLabel::PEOPLE f)
{ } void GLabel::setSize(QString ¶mstr)
{
// int all_word_width = this->fontMetrics().width(paramstr);
// int one_line_height = this->fontMetrics().lineSpacing();
int max_width = parent_maxwidth-;//-label_people->width();
int all_word_width; label_text->setWordWrap(false);
label_text->setText(paramstr);
label_text->adjustSize();
all_word_width = label_text->width();
label_text->setWordWrap(true); float line_count;
int line; if(all_word_width > max_width)
{
// line_count = (float)all_word_width/max_width;
// line = (int)line_count;
// if(line < line_count)line=line+2;
label_text->setMaximumWidth(max_width--);
label_text->setText(paramstr);
label_text->adjustSize();
qDebug()<<"the size of text"<<label_text->size()<<((QWidget*)this->parent())->width()-; m_height = label_text->height()/*line*one_line_height*/;
m_width = parent_maxwidth-;
// qDebug()<<"linr_count"<<line_count<<one_line_height<<max_width<<all_word_width;
this->resize(m_width,m_height+);
}
else
{
label_text->setWordWrap(false);
m_height = ; label_text->setText(paramstr);
label_text->adjustSize();
m_width = label_text->width()++;
//label_text->setMinimumWidth(all_word_width);
this->resize(m_width+,m_height);
} if(people == GLabel::She)
label_text->setGeometry(+,,this->width()--,this->height()-);
else
label_text->setGeometry(,,this->width()--,this->height()-); update();
} void GLabel::setOurText(QString paramstr)
{
setSize(paramstr);
qDebug()<<"setSize"<<this->width()<<this->height();
//label_text->setWordWrap(true);
// label_text->setText(paramstr);
} void GLabel::mousePressEvent(QMouseEvent *e)
{
qDebug()<<"this pos is"<<e->pos();
} void GLabel::setHeadpic(QString dir)
{
label_people->setPixmap(QPixmap(dir));
} void GLabel::paintEvent(QPaintEvent *e)
{
//QPainter painter(this);
if(people == GLabel::She)
{
QRectF rectangle(50.0, 10.0, this->width()--, this->height()-); QPainter painter(this);
painter.setRenderHint( QPainter::Antialiasing, true );
painter.setBrush(QBrush(QColor(,,)));
painter.drawRoundedRect(rectangle,,); QPointF points[] = {
QPointF(, ),
QPointF(, ),
QPointF(, ),
}; QPen pen;
pen.setColor(QColor(,,));
painter.setPen(pen);
painter.drawPolygon(points, ); QPen pen1;
pen.setColor(Qt::black);
painter.setPen(pen1);
painter.drawLine(points[],points[]);
painter.drawLine(points[],points[]);
}
else if(people == GLabel::Me)
{
QRectF rectangle(10.0, 10.0, this->width()--, this->height()-); QPainter painter(this);
painter.setRenderHint( QPainter::Antialiasing, true );
painter.setBrush(QBrush(QColor(,,)));
painter.drawRoundedRect(rectangle,,); QPointF points[] = {
QPointF(this->width()-, ),
QPointF(this->width()-, ),
QPointF(this->width()-,),
}; QPen pen;
pen.setColor(QColor(,,));
painter.setPen(pen);
painter.drawPolygon(points, ); QPen pen1;
pen.setColor(Qt::black);
painter.setPen(pen1);
painter.drawLine(points[],points[]);
painter.drawLine(points[],points[]); // label_text->setGeometry(20,20,this->width()-40-30,this->height()-40);
label_people->setGeometry(this->width()-,,,);
this->setGeometry(((QWidget*)this->parent())->width()--this->width(),this->y(),this->width(),this->height());
}
// qDebug()<<"this size of pix"<<label_people->size();
// drawShe();
}
实际调用:
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug> Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this); label[] = new GLabel(this,GLabel::Me);
label[]->setGeometry(,,,);
label[]->setOurText(tr("你好!"));
label[]->show(); label[] = new GLabel(this,GLabel::She);
label[]->setGeometry(,label[]->y()+label[]->height(),,);
label[]->setOurText(tr("你好!"));
label[]->show(); label[] = new GLabel(this,GLabel::Me);
label[]->setGeometry(,label[]->y()+label[]->height(),,);
label[]->setOurText(tr("我们好像在哪里见过?"));
label[]->show(); label[] = new GLabel(this,GLabel::She);
label[]->setGeometry(,label[]->y()+label[]->height(),,);
label[]->setOurText(tr("?"));
label[]->show(); label[] = new GLabel(this,GLabel::Me);
label[]->setGeometry(,label[]->y()+label[]->height(),,);
label[]->setOurText(tr("我们好像在哪见过你记得吗?好像那是一个秋天夕阳西下,你美得让我不敢和你说话,你经过我时风起浮动我的发"));
label[]->show(); label[] = new GLabel(this,GLabel::She);
label[]->setGeometry(,label[]->y()+label[]->height(),,);
label[]->setOurText(tr("银杏还是会黄的,雪也会再次染白整个世界。安好"));
label[]->show();
} Dialog::~Dialog()
{
delete ui;
}
下载:http://download.csdn.net/download/yangkping123/8620775
聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标的更多相关文章
- 在Microsoft Expression Blend 2 中绘制圆角矩形按钮
原文:在Microsoft Expression Blend 2 中绘制圆角矩形按钮 /* 声明:转载请保留此信息:http://www.BrawDraw.com, http://www.ZPXP.c ...
- canva绘制圆角矩形
在做组态的时候,需要支持矩形圆角格式,但是因为canvas本身不带有圆角矩形,需要自行算出坐标进行绘制 方案一.统一圆角 <!DOCTYPE html> <html> < ...
- Android中绘制圆角矩形图片及任意形状图片
圆角矩形图片在苹果的产品中很流行,相比于普通的矩形,很多人都喜欢圆角矩形的图片,因为它避开了直角的生硬,带来更好的用户体验,下面是几个设计的例子: 下面在Android中实现将普通的矩形图片绘制成圆角 ...
- Delphi中绘制圆角矩形的窗体
制作圆角矩形的窗体: 01.procedure TPortForm.FormCreate(Sender: Tobject); 02.var hr :thandle; 03.begin 04.hr:=c ...
- C# 绘制圆角矩形
Graphics g = e.Graphics; // 圆角半径 ; // 要实现 圆角化的 矩形 Rectangle rect = , , panel4.Width - cRadius, panel ...
- Cocos2d-x绘制圆角矩形
/* * @brief 画圆角矩形 * @param origin 矩形开始点 * @param destination 矩形结束点 * @param radius 圆角半径 * @param seg ...
- canvas 绘制圆角矩形
<!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...
- 使用Draw rect 绘制圆角矩形
- (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPush ...
- C#绘制三角形并填充,使用winform实现qq聊天气泡
首先是需求,需要制作一个聊天气泡, 但是winform中有没有类似Android的.9图,只有自己设计图形拼接气泡. 第一种是绘制空心三角形,第二种是绘制三角形区域,可以指定RGB颜色. privat ...
随机推荐
- (step5.1.3)hdu 1213( How Many Tables——1213)
题目大意:输入两个整数n,m.分别表示点数.对点的操作的次数.在接下来的m行中,每行有两个整数a,b.表示a和b是好朋友.(不是好朋友的不能坐在同一个桌子上) .求需要多少张桌子 解题思路:并查集 1 ...
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...
- C#_会员管理系统:开发一(用户登录)
首先创建数据库: [Vip] 创建三张表: 分别是: [VipInformation](会员信息) [Log](日志) [VipAccount](账户权限) 详细语句: --创建数据库[Vip] cr ...
- C++,对象的 =赋值 以及 复制构造函数赋值
1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...
- 键盘过滤第一个例子ctrl2cap(4.1~4.4)汇总,测试
键盘过滤第一个例子ctrl2cap(4.1~4.4)汇总,测试 完整源代码 /// /// @file ctrl2cap.c /// @author wowocock /// @date 2009-1 ...
- 【 D3.js 入门系列 — 3 】 做一个简单的图表!
图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...
- Python基础2:反射、装饰器、JSON,接口
一.反射 最近接触到python的反射机制,遂记录下来已巩固.但是,笔者也是粗略的使用了__import__, getattr()函数而已.目前,笔者的理解是,反射可以使用户通过自定义输入来导入响应的 ...
- Raphael入门实例:动画与箭头
raphael 实例 动画 隐藏和显示参数说明 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 var c = paper.circle(50, 50, 40); function ...
- webform--常用的控件
一.简单控件 1.Lable——标签:在网页中呈现出来的时候会变成span标签 属性:Text——标签上的文字 BackColor,ForeColor——背景色,前景色 Font——字体 Bold- ...
- Matlab中S函数建立与应用
function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag) % SFUNTMPL 是M-文件 S函数模板 % 通过剪裁,用户可以生成自己的S函数,不过一定要重新命 ...