欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Fedora14 基于Qt的UDP傳輸文字聊天小軟件實現

系統 1960 0

先上一張最后運行結果圖,順便說下開發環境:fedora14+qt4.8.1.界面的搭建是用designer畫的,以前還沒用過,都用程序寫界面發現吃力不討好,用designer畫的效果和程序寫時完全等價的。他會自動生成一個類似android下的xml布局文件,并且自動關聯槽函數,不用白不用,哈哈!基類為widget。

Fedora14 基于Qt的UDP傳輸文字聊天小軟件實現 (Qt查詢本地Ip、Qt本地時間顯示、傳輸中文漢字實現、Qt的textedit自動滾屏實現、給QPushButton設鍵盤快捷實現)---續上

先交代幾個重要變量:

192.168.2.211 對應變量 ipEdit

6665 ------------------------portEdit

信息交互欄下面的編輯框------getEdit

發送信息下面的編輯框--------sendEdit

另外幾個按鈕就不多說了!

I、 widget.h的代碼:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork/QUdpSocket>
#include<QtNetwork/QHostAddress>
#include <QMessageBox>
#include <QHostInfo>
#include <QNetworkInterface>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();
QHostAddress *localHostAddr;
QHostAddress *remoteHostAddr;
QString localIpStr;
QString remoteIpStr;

QString getIp();
void autoScroll();

private slots:
void send();
void receive();
void on_clearButton_clicked();

void on_configButton_clicked();

void on_exitButton_clicked();

private:
Ui::Widget *ui;
QUdpSocket *udpSocket1;
bool configFlag;
};

#endif // WIDGET_H

II、 widget.cpp里的核心代碼及說明:

首先初始化如下: ui->setupUi(this);
configFlag = false; //初始化連接參數 為未連接
ui->getTextEdit->ensureCursorVisible();
ui->sendTextEdit->setFocus(); //程序啟動時,焦點停在發送對話框
ui->ipEdit->setText("192.168.2.211"); //設置默認的遠程端Ip
ui->portEdit->setText("6665"); //設置默認端口號

一、快捷鍵設置:

ui->udpSendButton->setShortcut(tr("Alt+F"));

這點重點說下,不知道為什么想用Ctrl+Enter,但用不了,用其他快捷鍵就可以,這里用Alt+F。

二、本地Ip的查找

這塊是最曲折的。最初是用

// QHostInfo info = QHostInfo::fromName(QHostInfo::localHostName());
// hostaddr1 = info.addresses().takeFirst();

這樣查詢出的hostaddr1其實是本地回環Ip地址, hostaddrStr = hostaddr1.toString();,可以用qDebug()<<hostaddrStr打印一下,發現結果是127.0.0.1.并不是真正的本地Ip地址。localHostAddr = new QHostAddress(localIpStr);如果這里用new QhostAddrress(hostaddr1),用這個地址的話可以自己給自己發,但和局域網其他機器通訊時是根本不可能的。

這里提供一下查詢本地Ip的函數:

QString Widget::getIp()
{
QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress address, list)
{
if(address.protocol() == QAbstractSocket::IPv4Protocol) //我們使用IPv4地址
{
if(address.toString().contains("127.0."))
continue;
qDebug()<<"本機Ip:"<<address.toString();
return address.toString();
}
}
return 0;

}

只有這個函數,打印出來的Ip地址才是你機器上真正的Ip。

所以我們

localIpStr = getIp();

localHostAddr = new QHostAddress(localIpStr);

首先獲得本地Ip地址,用這個Ip地址也初始化QHostAddress變量。這是我們的本地Ip.

udpSocket1 = new QUdpSocket(this);
bool bindFlag = udpSocket1->bind(*localHostAddr, 6665, QUdpSocket::ShareAddress);

上面是初始化一個udpsocket,將他和本地Ip及 開放的端口號綁定在一起。

接下來判斷綁定失敗與否:

if(!bindFlag)
{
QMessageBox box;
box.setText(tr("初始化綁定socket錯誤!"));
box.exec();
}
else
{
connect(udpSocket1, SIGNAL(readyRead()), this, SLOT(receive()));
connect(ui->udpSendButton, SIGNAL(clicked()), this, SLOT(send()));
}

綁定成功了,就連接槽函數,第一個receive()是udpSocket1在接收到數據時觸發的,第二個send()是當按下發送按鍵時,往對端機器發信息的。接收數據和發送數據時同一個Socket!大家注意了,網上其他人用一個socket接收,一個socket發送。可能也可以把,這里用一個。

this->setWindowTitle(tr("基于Qt的UDP聊天界面-------頂禮準提佛母")); 設置標題。

(頂禮準提佛母,頂禮南師懷瑾,希望大家少殺生少吃肉,孝敬父母, 多多貢獻源碼

南懷瑾老師傳承的準提心咒: http://user.qzone.qq.com/707798286/blog/1341824452

南懷瑾老師念誦準提咒100遍30分鐘版本: ttp://www.tudou.com/programs/view/7eqpbQ7O8UQ/

南<wbr>懷<wbr>瑾<wbr>老<wbr>師<wbr>2<wbr>0<wbr>0<wbr>2<wbr>年<wbr>香<wbr>港<wbr><span style="color:#ff0000">準</span><wbr><span style="color:#ff0000">提</span><wbr><span style="color:#ff0000">法</span><wbr>開<wbr>示:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> http://wenku.baidu.com/view/f86c34d7195f312b3169a577.html

南<wbr>懷<wbr>瑾<wbr>老<wbr>師<wbr>教<wbr>念<wbr>的<wbr><strong><span style="color:#ff0000">準</span><wbr><span style="color:#ff0000">提</span><wbr><span style="color:#ff0000">咒</span>:</wbr></wbr></strong></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> http://wenku.baidu.com/view/6369277f168884868762d673.html

金<wbr>剛<wbr>上<wbr>師<wbr>南<wbr>公<wbr>懷<wbr>瑾<wbr>傳<wbr>授<wbr><span style="color:#ff0000">準</span><wbr><span style="color:#ff0000">提</span><wbr><span style="color:#ff0000">法</span><wbr>修<wbr>持<wbr>要<wbr>領<wbr>開<wbr>示(1978年9月):</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> http://wenku.baidu.com/view/c5f1c14fc850ad02de804153.html )<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

南師慈悲叮嚀:持 準提咒 容易疏忽之處 http://www.xuefo.net/nr/article10/103024.html

-------------不喜歡的敬請繞過。

三、發送數據的槽函數-----解決發送中文亂碼的關鍵

void Widget::send()
{
autoScroll();
QString sendStr = ui->sendTextEdit->toPlainText();
QByteArray sendByteArray = sendStr.toAscii();
QMessageBox box;
if(sendStr.length()==0)
{
box.setText(tr("請輸入發送內容"));
box.exec();
}
else if(configFlag)
{

udpSocket1->writeDatagram(sendByteArray, sendByteArray.length(), *remoteHostAddr, 6665);

//本地發送信息再信息交互窗口的顯示
QDateTime time;
QString timeStr = time.currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
ui->getTextEdit->setTextColor(QColor("red"));
ui->getTextEdit->insertPlainText("本機" + localIpStr + ": " + timeStr + "\n");
ui->getTextEdit->setTextColor(QColor("black"));
ui->getTextEdit->insertPlainText( sendStr +"\n");
ui->sendTextEdit->clear(); //點擊發送后,發送編輯框內清零
ui->sendTextEdit->setFocus(); //焦點停留在發送編輯框
}
else if(!configFlag)
{
box.setText("請您先點擊確認按鈕!");
box.exec();
}
}

這里有幾點說說:

1,發送數據的實現

QString sendStr = ui->sendTextEdit->toPlainText();
QByteArray sendByteArray = sendStr.toAscii();
udpSocket1->writeDatagram(sendByteArray, sendByteArray.length(), *remoteHostAddr, 6665);

能否正確顯示中文就在這一句,必須把QString轉成QByteArray再發送,接收端有好幾種實現方法,但發送端不這么搞的話,就解析不了中文。這塊讓我搞了一整天!

2,本地時間顯示

QDateTime time;
QString timeStr = time.currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd"); 要包含一個頭文件,#include <qdatetime.h>,奇怪的是這個頭文件包含在widget.h里就不行,非要搞到widget.cpp里才中。

3,顯示文本的時候 ui->getTextEdit->insertPlainText( sendStr +"\n");
ui->sendTextEdit->clear(); //點擊發送后,發送編輯框內清零
ui->sendTextEdit->setFocus(); //焦點停留在發送編輯框

一定要搞成insertPlainText,如果搞成setText,就會把顯示窗口搞成只有一句話,這個函數是不銷毀以前的內容,插入在以前的文本內容之后的函數。

4,自動滾屏的實現,函數實現為:

void Widget::autoScroll()
{
QTextCursor cursor = ui->getTextEdit->textCursor();
cursor.movePosition(QTextCursor::End);
ui->getTextEdit->setTextCursor(cursor);
}

這里插一句,getEdit,的屬性里設成enables,read Only,在designer里,點控件,設置屬性里這么設置。如果不設自動滾屏是什么效果呢??

Fedora14 基于Qt的UDP傳輸文字聊天小軟件實現 (Qt查詢本地Ip、Qt本地時間顯示、傳輸中文漢字實現、Qt的textedit自動滾屏實現、給QPushButton設鍵盤快捷實現)---續上

只有拖動右邊滾動鼠標才能顯示,所以一定要設自動滾屏。而且在兩個地方,一個是receive里調用這個函數,有東西顯示的時候,滾屏到最后顯示! 點發送的時候,也要調用這個滾屏函數,如果您聊天的時候,把光標停留在信息交互欄里某個位置A,下一條信息就會顯示在A光標后,而不是我們希望的每次都挨著上一條信息后顯示。所以點發送按鈕后,要先調用,目的在此!

四、接收槽函數的實現

void Widget::receive()
{
while(udpSocket1->hasPendingDatagrams())
{
QTextCodec *tc=QTextCodec::codecForName("UTF-8"); //UTF-8
QDateTime time;
QString timeStr = time.currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");

QByteArray data;
data.resize(udpSocket1->pendingDatagramSize());
udpSocket1->readDatagram(data.data(), data.size());
// QString dataStr = QString::fromUtf8(data.data()); //這樣寫也是正確的
QString dataStr = tc->toUnicode(data);
ui->getTextEdit->setTextColor(QColor("red"));
ui->getTextEdit->insertPlainText("遠程" + remoteIpStr+": "+ timeStr +"\n" );
ui->getTextEdit->setTextColor(QColor("black"));
ui->getTextEdit->insertPlainText(dataStr + "\n" );
autoScroll();

}

}

為了顯示中文,關鍵在三句

QTextCodec *tc=QTextCodec::codecForName("UTF-8");

QString dataStr = tc->toUnicode(data);
如果不寫這兩句,用這句也可以實現:QString dataStr = QString::fromUtf8(data.data());

五,點確定按鈕的槽函數:

void Widget::on_configButton_clicked()
{
remoteIpStr = ui->ipEdit->text();
QString port = ui->portEdit->text();
qDebug()<<"遠程端Ip:"<<remoteIpStr<<"端口號:"<<port;
remoteHostAddr = new QHostAddress(remoteIpStr);

QMessageBox box;
if(remoteIpStr.length()==0 || port.length()==0 || port.toInt()<1024)
{
configFlag = false;
box.setText("請正確設置遠程端Ip地址和端口號!");
box.exec();
}
else
{
configFlag = true;
box.setText("您設置的遠程端Ip:" + remoteIpStr+"端口號:"+port);
box.exec();
}

}

用來初始化遠程Ip地址!

至此唯一不完美的是,如何為qt編寫的程序添加一個圖標?下午搞了一會,沒有成功!網上貌似說的都是在windows下,我要再linux下。哪位大神實現了指點一下后學。

源碼下載: http://download.csdn.net/detail/yanzi1225627/4475122

Fedora14 基于Qt的UDP傳輸文字聊天小軟件實現 (Qt查詢本地Ip、Qt本地時間顯示、傳輸中文漢字實現、Qt的textedit自動滾屏實現、給QPushButton設鍵盤快捷實現)---續上


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91视频在线 | 潘金莲强完整版 | 91伊人| 欧美高清网站 | 精品日本三级在线观看视频 | 成人综合网站 | 国产成人亚洲综合a∨婷婷 91亚洲精品一区二区福利 | 999精品久久久 | 亚洲一区二区三区在线播放 | 久久九| 精品国产一区二区三区香蕉沈先生 | 日韩二区 | 欧美三级在线播放 | 精品国产成a人在线观看 | 在线看片国产 | 亚洲精品欧美一区二区三区 | 国产一级特黄毛片在线毛片 | 老子午夜影院 | 国产精品久久久久无码av | av在线播放国产 | 天天噜日日噜夜夜噜 | 国产毛片a精品毛 | 大陆黄色网 | 日韩欧美二区 | 午夜社区 | 欧美一级网 | 狠狠色噜噜综合社区 | 中文字幕伊人久久网 | 成av在线 | 一级片国产片 | 国产精选经典三级小泽玛利亚 | 国产午夜精品理论片免费观看 | 888奇米影视 | 狠狠操操| 四虎免费在线观看视频 | 好吊在线 | 欧美综合成人 | 欧美啪啪网址 | av色在线观看 | 午夜a级片| 成人亚洲一区二区三区 |