专栏中心

EEPW首页 > 专栏 > QTextEdit实现QQ聊天对话框效果

QTextEdit实现QQ聊天对话框效果

发布人:华嵌 时间:2013-08-09 来源:工程师 发布文章

   

作者:武汉华嵌技术部

本文主要介绍了怎么使用QTextEdit控件实现类似QQ聊天对话框的效果,包括令对话框显示不同的字体、颜色,实现QQ震动效果和QQ表情效果(即在QTextEdit中显示图片)。Demo运行的界面如下图所示:

 

点击相关按钮可以改变输入文本框的字体,改变输入文本框的颜色,实现QQ震动效果,以及在文本框中添加自定义图片。下面将通过demo讲解实现原理。

#include <QtGui>

#include "qt1.h"

Qt1::Qt1(QWidget *parent):QDialog(parent)

{

    setupUi(this);

    tbfont->setIcon(QIcon("./images/bold.png"));

    tbcolor->setIcon(QIcon("./images/color.png"));

    tbtru->setIcon(QIcon("./images/italic.png"));

    tbbq->setIcon(QIcon("./images/biaoqing.png"));

    tbsend->setIcon(QIcon("./images/underline.png"));

 

    connect(tbfont,SIGNAL(clicked()),this,SLOT(fontfun()));//字体类型

    connect(tbcolor,SIGNAL(clicked()),this,SLOT(colorfun()));//字体颜色

    connect(tbtru,SIGNAL(clicked()),this,SLOT(trumfun()));//震动

    connect(tbbq,SIGNAL(clicked()),this,SLOT(insertImage()));//插入图片

    connect(tbsend,SIGNAL(clicked()),this,SLOT(sendfun()));//发送消息

}

 

void Qt1::fontfun()//设置字体类型

{

    bool ok;

    QFont font = QFontDialog::getFont(

                 &ok, QFont("Helvetica [Cronyx]", 10), this);

    if (ok)

    {

            te2->setFont(font);

        f = font;

    }

}

     

void Qt1::colorfun() //设置字体颜色

{

    QColor color = QColorDialog::getColor ( Qt::red, this );

    te2->setTextColor(color);

    c = color;

}

 

void Qt1::trumfun() //震动效果实现

{

    QPoint p = getPos(this);//获取当前窗口坐标

    int x = p.x();

    int y = p.y();

    int i = 0;

 

    for(i=0;i<10;i++)//改变窗口位置实现震动效果

    {

        this->move(x+5,y+5);

        usleep(300);

        this->move(x,y);

        usleep(300);

        this->move(x-5,y-5);

        usleep(300);

        this->move(x,y);

    }  

 

    this->move(x-1,y-28);

}

 

void Qt1::sendfun()

{

    QFont ff (QFont( "AR PL UKai CN,10,-1,5,50,0,0,0,0,0" )) ;

    QColor cc (0,0,0);

    setInsertTextColor(cc);//设置系统时间字体颜色

    setInsertTextFont(ff);//设置系统时间字体类型

    te1->append(showTime());

    setInsertTextColor(c);//设置插入字体颜色

    setInsertTextFont(f);//设置插入字体字体类型

    te1->append(te2->toPlainText());

    te2->clear();

}

 

void Qt1::setInsertTextColor(const QColor &col)//把col颜色作为字体颜色

{

    QTextCharFormat fmt;//文本字符格式

    fmt.setForeground(col);// 前景色(即字体色)设为col色

    QTextCursor cursor = te1->textCursor();//获取文本光标

    cursor.mergeCharFormat(fmt);//光标后的文字就用该格式显示

    te1->mergeCurrentCharFormat(fmt);//textEdit使用当前的字符格式

}

 

void Qt1::setInsertTextFont(const QFont &col)//把col颜色作为字体颜色

{

    QTextCharFormat fmt;//文本字符格式

    fmt.setFont(col);//字体

    QTextCursor cursor = te1->textCursor();//获取文本光标

    cursor.mergeCharFormat(fmt);//光标后的文字就用该格式显示

    te1->mergeCurrentCharFormat(fmt);//textEdit使用当前的字符格式

}

 

void Qt1::insertImage() //文本编辑框中插入图片

{

    QString file = QFileDialog::getOpenFileName(this, tr("Open File"),"pic/",\

                                            tr("Images (*.png *.jpg)"));

    QUrl Uri ( QString ( "file://%1" ).arg ( file ) );

    QImage image = QImageReader ( file ).read();

 

    QTextDocument * textDocument = te2->document();

    textDocument->addResource( QTextDocument::ImageResource, Uri, QVariant ( image ) );

    QTextCursor cursor = te2->textCursor();

    QTextImageFormat imageFormat;

    imageFormat.setWidth( image.width() );

    imageFormat.setHeight( image.height() );

    imageFormat.setName( Uri.toString() );

    cursor.insertImage(imageFormat);

 }

 

QPoint Qt1::getPos(QWidget* widget)//获取窗体位置坐标

{

     if (NULL == widget)

     {

        return QPoint(-1,-1);

     }

     

     float px = 0;

     float py = 0;

     QWidget *parent = widget;

     QWidget *preParent= NULL;

     do

     {

          QPoint p = parent->pos();

          px += p.x();

          py += p.y();

          preParent = parent ;

          parent = parent->parentWidget();

     } while (NULL != parent);

     

     QSize size = preParent->frameSize();

     QSize size2 = preParent->size();

     px = px + (size.width() - size2.width())/2;

     py = py + (size.height() - size2.height() - (size.width() - size2.width())/2);

     QPoint pr(px, py);

     

     return pr;

}

 

QString Qt1::showTime()//获取系统时间

{

    QTime time=QTime::currentTime();

    QString text = time.toString("hh:mm:ss");

 

    return text;

}

------分隔线----------------------------

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

意法半导体Stellar P3E:车载边缘AI MCU 开启汽车多合一电控新时代

Ceva新一代UWB IP具有更远的传输距离和更高的吞吐量

EDA/PCB 2026-03-11

应用材料携手美光 加速HBM、闪存及DRAM技术研发

ZLG500C 应用文档V1.0 (仅对购买ZLG500C产品的客户开...

Groq向三星提出AI芯片扩产需求,推论芯片市场或迎爆发

智能计算 2026-03-10

IAR扩展嵌入式开发平台,推出面向安全关键型应用的长期支持(LTS)服务

Nordic扩展nRF54L系列,推出入门级低功耗蓝牙SoC

SEALSQ推出量子系统PQC栈

国立成功大学:基于 NetFPGA 平台之 OpenFlow 虚拟网路频宽管理系统

视频 2012-06-07

ZLG500BX2 器件读卡模块简介

伊朗局势紧张,亚洲汽车供应链面临冲击

赛灵思宣传片

视频 2012-06-08

ZLG500B读卡模块演示软件

第三届OpenHW开源硬件与嵌入式大赛总决赛现场实录

视频 2012-06-08

ZLG500B 应用文档V1.4 (仅对购买ZLG500B产品的客户开...

Emerson推出NI USRP X420软件定义无线电

电动汽车磁铁市场预计到2030年达到95亿美元

大嘴业话:企业转型模式的探讨

视频 2012-06-11

北京工业大学:基于FPGA的情绪检测程序与相关智能宠物的开发

视频 2012-06-15
更多 培训课堂
更多 焦点
更多 视频

技术专区