1. 程式人生 > >Qt版聊天軟體

Qt版聊天軟體

18.1 核心功能介面演示
drawer.h
#ifndefDRAWER_H
#defineDRAWER_H
#include"widget.h"
#include<QToolBox>
#include<QToolButton>
classDrawer:publicQToolBox
{
Q_OBJECT
public:
Drawer(QWidget*parent=0,Qt::WindowFlagsf=0);
private:
QToolButton*toolBtn1;
QToolButton*toolBtn2;
QToolButton*toolBtn3
;
QToolButton*toolBtn4;
QToolButton*toolBtn5;
QToolButton*toolBtn6;
QToolButton*toolBtn7;
QToolButton*toolBtn8;
QToolButton*toolBtn9;
privateslots:
voidshowChatWidget1();
voidshowChatWidget2();
voidshowChatWidget3();
voidshowChatWidget4();
voidshowChatWidget5();
voidshowChatWidget6();
void
showChatWidget7();
voidshowChatWidget8();
voidshowChatWidget9();
private:
Widget*chatWidget1;
Widget*chatWidget2;
Widget*chatWidget3;
Widget*chatWidget4;
Widget*chatWidget5;
Widget*chatWidget6;
Widget*chatWidget7;
Widget*chatWidget8;
Widget*chatWidget9;
};
#endif//DRAWER_H drawer.cpp
#include
"drawer.h"
#include<QGroupBox>
#include<QVBoxLayout>
classQStringrsrcPath=":/images";
Drawer::Drawer(QWidget*parent,Qt::WindowFlagsf)
:QToolBox(parent,f)
{
setWindowTitle(tr("MyselfQQ2015"));
setWindowIcon(QPixmap(rsrcPath+"/qq.png"));
toolBtn1=newQToolButton;
toolBtn1->setText(tr("苦澀沙漠"));
toolBtn1->setIcon(QPixmap(rsrcPath+"/Cherry.png"));
toolBtn1->setIconSize(QPixmap(rsrcPath+"/Cherry.png").size()*0.58);
toolBtn1->setAutoRaise(true);//當滑鼠離開時,按鈕自動恢復成彈起狀態
toolBtn1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn1,SIGNAL(clicked(bool)),this,SLOT(showChatWidget1()));
toolBtn2=newQToolButton;
toolBtn2->setText(tr("飄逝的雲"));
toolBtn2->setIcon(QPixmap(rsrcPath+"/dr.png"));
toolBtn2->setIconSize(QPixmap(rsrcPath+"/dr.png").size()*0.58);
toolBtn2->setAutoRaise(true);//當滑鼠離開時,按鈕自動恢復成彈起狀態
toolBtn2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn2,SIGNAL(clicked(bool)),this,SLOT(showChatWidget2()));
toolBtn3=newQToolButton;
toolBtn3->setText(tr("會飛的狼"));
toolBtn3->setIcon(QPixmap(rsrcPath+"/jj.png"));
toolBtn3->setIconSize(QPixmap(rsrcPath+"/dr.png").size()*0.58);
toolBtn3->setAutoRaise(true);
toolBtn3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn3,SIGNAL(clicked(bool)),this,SLOT(showChatWidget3()));
toolBtn4=newQToolButton;
toolBtn4->setText(tr("金色的魚"));
toolBtn4->setIcon(QPixmap(rsrcPath+"/lswh.png"));
toolBtn4->setIconSize(QPixmap(rsrcPath+"/lswh.png").size()*0.58);
toolBtn4->setAutoRaise(true);
toolBtn4->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn4,SIGNAL(clicked(bool)),this,SLOT(showChatWidget4()));
toolBtn5=newQToolButton;
toolBtn5->setText(tr("一夜情柔"));
toolBtn5->setIcon(QPixmap(rsrcPath+"/qmnn.png"));
toolBtn5->setIconSize(QPixmap(rsrcPath+"/qmnn.png").size()*0.58);
toolBtn5->setAutoRaise(true);
toolBtn5->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn5,SIGNAL(clicked(bool)),this,SLOT(showChatWidget5()));
toolBtn6=newQToolButton;
toolBtn6->setText(tr("天馬行空"));
toolBtn6->setIcon(QPixmap(rsrcPath+"/spqy.png"));
toolBtn6->setIconSize(QPixmap(rsrcPath+"/spqy.png").size()*0.58);
toolBtn6->setAutoRaise(true);
toolBtn6->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn6,SIGNAL(clicked(bool)),this,SLOT(showChatWidget6()));
toolBtn7=newQToolButton;
toolBtn7->setText(tr("飛奔時代"));
toolBtn7->setIcon(QPixmap(rsrcPath+"/wy.png"));
toolBtn7->setIconSize(QPixmap(rsrcPath+"/wy.png").size()*0.58);
toolBtn7->setAutoRaise(true);
toolBtn7->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn7,SIGNAL(clicked(bool)),this,SLOT(showChatWidget7()));
toolBtn8=newQToolButton;
toolBtn8->setText(tr("一世情緣"));
toolBtn8->setIcon(QPixmap(rsrcPath+"/qq.png"));
toolBtn8->setIconSize(QPixmap(rsrcPath+"/qq.png").size()*0.58);
toolBtn8->setAutoRaise(true);
toolBtn8->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn8,SIGNAL(clicked(bool)),this,SLOT(showChatWidget8()));
toolBtn9=newQToolButton;
toolBtn9->setText(tr("鍾愛一生"));
toolBtn9->setIcon(QPixmap(rsrcPath+"/ymrl.png"));
toolBtn9->setIconSize(QPixmap(rsrcPath+"/ymrl.png").size()*0.58);
toolBtn9->setAutoRaise(true);
toolBtn9->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
connect(toolBtn9,SIGNAL(clicked(bool)),this,SLOT(showChatWidget9()));
//建立一個QGroupBox類類例項,在文字例中對應抽屜“群成員”
QGroupBox*groupBox=newQGroupBox;
QVBoxLayout*layout=newQVBoxLayout(groupBox);
layout->setMargin(6);//設定邊框距
layout->setSpacing(2);
layout->setAlignment(Qt::AlignLeft|Qt::AlignTop);
layout->addWidget(toolBtn1);
layout->addWidget(toolBtn2);
layout->addWidget(toolBtn3);
layout->addWidget(toolBtn4);
layout->addWidget(toolBtn5);
layout->addWidget(toolBtn6);
layout->addWidget(toolBtn7);
layout->addWidget(toolBtn8);
layout->addWidget(toolBtn9);
this->addItem((QWidget*)groupBox,tr("群成員"));
}
voidDrawer::showChatWidget1()
{
//以按鈕toolBtn1的文字為使用者名稱建立一個Widget類的例項,對應於一個聊天視窗
chatWidget1=newWidget(0,toolBtn1->text());
//設定聊天的標題文字
chatWidget1->setWindowTitle(toolBtn1->text());
//設定聊天視窗圖示
chatWidget1->setWindowIcon(toolBtn1->icon());
chatWidget1->show();
}
voidDrawer::showChatWidget2()
{
chatWidget2=newWidget(0,toolBtn2->text());
chatWidget2->setWindowTitle(toolBtn2->text());
chatWidget2->setWindowIcon(toolBtn2->icon());
chatWidget2->show();
}
voidDrawer::showChatWidget3()
{
chatWidget3=newWidget(0,toolBtn3->text());
chatWidget3->setWindowTitle(toolBtn3->text());
chatWidget3->setWindowIcon(toolBtn3->icon());
chatWidget3->show();
}
voidDrawer::showChatWidget4()
{
chatWidget4=newWidget(0,toolBtn4->text());
chatWidget4->setWindowTitle(toolBtn4->text());
chatWidget4->setWindowIcon(toolBtn4->icon());
chatWidget4->show();
}
voidDrawer::showChatWidget5()
{
chatWidget5=newWidget(0,toolBtn5->text());
chatWidget5->setWindowTitle(toolBtn5->text());
chatWidget5->setWindowIcon(toolBtn5->icon());
chatWidget5->show();
}
voidDrawer::showChatWidget6()
{
chatWidget6=newWidget(0,toolBtn6->text());
chatWidget6->setWindowTitle(toolBtn6->text());
chatWidget6->setWindowIcon(toolBtn6->icon());
chatWidget6->show();
}
voidDrawer::showChatWidget7()
{
chatWidget7=newWidget(0,toolBtn7->text());
chatWidget7->setWindowTitle(toolBtn7->text());
chatWidget7->setWindowIcon(toolBtn7->icon());
chatWidget7->show();
}
voidDrawer::showChatWidget8()
{
chatWidget8=newWidget(0,toolBtn8->text());
chatWidget8->setWindowTitle(toolBtn8->text());
chatWidget8->setWindowIcon(toolBtn8->icon());
chatWidget8->show();
}
voidDrawer::showChatWidget9()
{
chatWidget9=newWidget(0,toolBtn9->text());
chatWidget9->setWindowTitle(toolBtn9->text());
chatWidget9->setWindowIcon(toolBtn9->icon());
chatWidget9->show();
}
client.h
#ifndefCLIENT_H
#defineCLIENT_H
#include<QDialog>
#include<QHostAddress>
#include<QFile>
#include<QTime>
classQTcpSocket;
namespaceUi{
classClient;
}
classClient:publicQDialog
{
Q_OBJECT
public:
explicitClient(QWidget*parent=0);
~Client();
voidsetHostAddr(QHostAddressaddr);//獲取傳送端IP地址
voidsetFileName(QStringname);//獲取檔案儲存路徑
protected:
voidcloseEvent(QCloseEvent*);
private:
Ui::Client*ui;
QTcpSocket*tClnt;//客戶端套接字類
quint16blockSize;
QHostAddresshostAddr;
qint16tPort;
qint64totalBytes;//總共需接收的位元組數
qint64bytesReceived;//已接收位元組數
qint64fileNameSize;
QStringfileName;
QFile*locFile;//待接收的檔案
QByteArrayinBlock;//快取一次接收的資料
QTimetime;
privateslots:
voidnewConn();//連線到伺服器
voidreadMsg();//讀取檔案資料
voiddisplayErr(QAbstractSocket::SocketError);//顯示錯誤資訊
voidon_cCancleBtn_clicked();
voidon_cCloseBtn_clicked();
};
#endif//CLIENT_H
client.cpp
#include"client.h"
#include"ui_client.h"
#include<QTcpSocket>
#include<QDebug>
#include<QMessageBox>
Client::Client(QWidget*parent):
QDialog(parent),
ui(newUi::Client)
{
ui->setupUi(this);
setFixedSize(400,190);
totalBytes=0;
bytesReceived=0;
fileNameSize=0;
tClnt=newQTcpSocket(this);
tPort=5555;
/**/
connect(tClnt,SIGNAL(readyRead()),this,SLOT(readMsg()));
/*接收檔案的中途,一旦發生錯誤,則採用displayErr()槽函式輸出錯誤資訊*/
connect(tClnt,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayErr(QAbstractSocket::SocketError)));
}
Client::~Client()
{
deleteui;
}
/*
*獲取檔案儲存路徑
*/
voidClient::setFileName(QStringname)
{
locFile=newQFile(name);
}
/*
*獲取傳送端IP地址
*/
voidClient::setHostAddr(QHostAddressaddr)
{
hostAddr=addr;
newConn();
}
/*
*用來設定與伺服器的連線
*/
voidClient::newConn()
{
blockSize=0;
//中止當前的連線和重置套接字
tClnt->abort();
tClnt->connectToHost(hostAddr,tPort);
time.start();
}
voidClient::readMsg()
{
QDataStreamin(tClnt);
in.setVersion(QDataStream::Qt_4_7);
floatuseTime=time.elapsed();
if(bytesReceived<=sizeof(qint64)*2){
if((tClnt->bytesAvailable()>=sizeof(qint64)*2)&&(fileNameSize==0))
{
in>>totalBytes>>fileNameSize;
bytesReceived+=sizeof(qint64)*2;
}
if((tClnt->bytesAvailable()>=fileNameSize)&&(fileNameSize!=0)){
in>>fileName;
bytesReceived+=fileNameSize;
if(!locFile->open(QFile::WriteOnly)){
QMessageBox::warning(this,tr("應用程式"),tr("無法讀取檔案%1:\n%2.").arg(fileName).arg(locFile->errorString()));
return;
}
}else{
return;
}
}
if(bytesReceived<totalBytes){
bytesReceived+=tClnt->bytesAvailable();
inBlock=tClnt->readAll();
locFile->write(inBlock);
inBlock.resize(0);
}
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesReceived);
doublespeed=bytesReceived/useTime;
ui->cStatusLbl->setText(tr("已接收%1MB(%2MB/s)\n共%3MB已用時:%4秒\n估計剩餘時間:%5秒")
.arg(bytesReceived/(1024*1024))
.arg(speed*1000/(1024*1024),0,'f',2)
.arg(totalBytes/(1024*1024))
.arg(useTime/1000,0,'f',0)
.arg(totalBytes/speed/1000-useTime/1000,0,'f',0));
if(bytesReceived==totalBytes)
{
locFile->close();
tClnt->close();
ui->cStatusLbl->setText(tr("接收檔案%1完畢").arg(fileName));
}
}
/*
*接收檔案的中途,一旦發生錯誤,則採用displayErr()槽函式輸出錯誤資訊
*/
voidClient::displayErr(QAbstractSocket::SocketErrorsockErr)
{
switch(sockErr)
{
caseQAbstractSocket::RemoteHostClosedError:break;
default:qDebug()<<tClnt->errorString();
}
}
voidClient::on_cCancleBtn_clicked()
{
//中止當前的連線和重置套接字
tClnt->abort();
if(locFile->isOpen())
{
locFile->close();
}
}
voidClient::on_cCloseBtn_clicked()
{
//中止當前的連線和重置套接字
tClnt->abort();
if(locFile->isOpen())
{
locFile->close();
}
close();
}
voidClient::closeEvent(QCloseEvent*)
{
on_cCloseBtn_clicked();
}
server.h
#ifndefSERVER_H
#defineSERVER_H
#include<QDialog>
#include<QTime>
classQFile;
classQTcpServer;
classQTcpSocket;
namespaceUi{
classServer;
}
classServer:public
            
           

相關推薦

Qt聊天軟體

18.1 核心功能介面演示 drawer.h #ifndefDRAWER_H #defineDRAWER_H #include"widget.h" #in

Qt學習之路_6(Qt區域網聊天軟體)

#include "widget.h"#include "ui_widget.h"using namespace std::tr1;Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->

python 聊天軟體

#! /usr/bin/python3.4 from tkinter import * from tkinter.filedialog import askopenfilename import time from threading import Thread impor

仿QQ聊天軟體2.0

仿QQ聊天軟體2.0版 轉載請標明出處:牟尼的專欄 http://blog.csdn.net/u012027907     上次課設做了Java版的仿QQ聊天程式。這次軟體實訓,我們繼續完好了仿QQ聊天程式,將上次未完畢及不完好的地方

QtWord字處理軟體

演示介面 mychild.h #ifndefMYCHILD_H #defineMYCHILD_H #include<QTextEdit>

仿QQ聊天軟體及原始碼java

一直以來,很多java的同志們都沒有一個完整資料來參考。把原始碼貼出來,大家共享! import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dialog; import java.a

qt通過Tcp和SQL實現仿qq的聊天軟體

此專案較難,不建議初學者下載 資源下載: 專案流程圖: 程式執行效果: 客戶端: 1.引導介面,用於載入初始化圖片資源等 2.登入介面,包含判斷伺服器是否開啟,網路是否可用,資料庫資訊核對 3.註冊和找回密碼 4.主介面及退出 5.最關鍵之聊天介面 服

web聊天

影響 code 平鋪 圖片 內容 web 500px mar com <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

用swoole擴展 做的h5聊天室筆記

一個人 return hash php_eol d+ ear contain 消息 勿噴 聲明:該聊天室目前只有一對多,一對一的聊天功能,另外,因為沒有使用到mysql,所以還存在比較多的缺陷地方,但知道原理就差不多了,這裏主要分享下swoole簡易的聊天室制作思路。 開發

強化學習工具Horizon開源:Facebook曾用它優化線上視訊和聊天軟體

曉查 發自 凹非寺量子位 出品 | 公眾號 QbitAI Facebook上週末開源了一個強化學習工具——Horizon。 雖然之前也有其他公司開源過強化學習工具,但Facebook聲稱Horizon是第一個開源的“端到端”(end-to-end)強化學習工具。 它由Pyt

node.js_微信聊天軟體練習。

node.js介面實現: /** Created by sirun on 2018/11/18. */ /*** * 1.引入一個http標準 *伺服器:(1)提供基本的web服務,能夠被使用者訪問到客戶端頁面。 (2)建立一個套接字介面,

如何在Debian中啟用測試/不穩定軟體

為何要啟用測試版/不穩定版? 測試版/不穩定版的Debian給開發者提供了一個比當前穩定版更新的環境以及軟體。你們注意到了麼?其實這些穩定版啊不穩定版啊神馬的都是別名,比方說穩定版其實就是Debian的穩定發行版,而測試版將會是下一個Debian的穩定發行版(當然那是測試後的事了)。截至發稿為止

[原始碼和文件分享] 仿QQ和飛秋並支援語音視訊白板螢幕共享的即時聊天軟體

功能需求分析 使用者端的基本聊天資訊傳送,這些基本聊天資訊包括文字和圖片。文字和圖片聊天是聊天軟體最基礎的功能。使用者通過輸入IP來查詢使用者,並申請加為好友,在對方同意加為好友後,線上使用者列表就會更新使用者,把加入的使用者新增到使用者列表中。這樣,兩個使用者之前就可以實現通訊了。在資訊

golang簡易聊天

服務端: package main import ( "fmt" "net" ) type info struct { conn net.Conn name string } var ch chan string = make(chan s

Zulip 1.9.1 釋出,功能強大的群組聊天軟體

Zulip 1.9.1 已釋出,這是一款強大的開源群組聊天軟體,用 Python 編寫,使用 Django 框架,支援通過會話流的私人訊息和群聊。Zulip 還支援快速搜尋、拖放檔案上傳、影象預覽、組私人訊息、可聽通知、錯過電子郵件訊息提醒,桌面應用等等。 1.9.1 版本主要改善了 Zulip 的安

黑客破解聊天軟體。微信。QQ。微信密碼破解,微信解封。許可權空間等

微信破解,微信解封,微信記錄。許可權空間的加QQ351741114或者925192220 微信是新一代的聊天工具,我們不僅可以用它來和親朋好友聯絡,更可以和更多的人交流。它的出現也改變了一層不變的聊天模式。時常看到不少朋友,閒來無事就掛著微信。也有很多關於怎麼破

Qt qml的軟體架構設計

google: qt qml application architecture 有很多資源。 1 https://www.ics.com/blog/multilayered-architecture-qt-quick    這是一個大牛寫的一種架構:A Multila

python 實戰之模仿開發QQ聊天軟體(三)TCP/IP伺服器與客戶端建設

無論是p2p還是c/s還是b/s,只要用到通訊,必然是要用到今天寫的這個。 TCP/IP是網路軟體最核心的部分,缺少這個你只能當做單機遊戲玩。 TCP/IP,只需要搞清楚udp和tcp這兩個就可以了。 兩者的區別在於 udp每次傳送資訊都需要傳送ip和埠號,可以比

Python基於socket程式設計(UDP聊天

説明:多臺電腦連同一網路可通訊。 有介面版待更; 目錄 一、UDP聊天(無介面) 1. 架構 2. 程式碼 3. 測試 二、UDP聊天(可視介面)

Python基於socket程式設計(TCP聊天 含配置)

目錄 一、eclipse配置pyDev 1. 安裝 2.eclipse+pydev配置 3. eclipse配置 二、Tcp聊天(不可視)