QT被禁止文字qt聊天室了怎么办

Fedora14 基於Qt的UDP傳輸文字聊天小軟件實現 (Qt查詢本地Ip、Qt本地時間顯示、傳輸中文漢字實現、Qt的textedit自動滾屏實現、给QPushButton設鍵盤快捷實現)---續上
&&&&& 先上一張最後運行結果圖,順便說下開發環境:fedora14+qt4.8.1.界面的搭建是用designer畫的,以前還沒用過,都用
&&&&& 先上一張最後運行結果圖,順便說下開發環境:fedora14+qt4.8.1.界面的搭建是用designer畫的,以前還沒用過,都用程序寫界面發現吃力不討好,用designer畫的效果和程序寫時完全等價的。他會自動生成一個類似android下的xml布局文件,並且自動關聯槽函數,不用白不用,哈哈!基類为widget。
先交代幾個重要變量:
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 : public QWidget
&&& Q_OBJECT
&&& explicit Widget(QWidget *parent = 0);
&&& ~Widget();
&&& QHostAddress *localHostA
&&&& QHostAddress *remoteHostA
&&& QString localIpS
&&& QString remoteIpS
&&& QString getIp();
&&& void autoScroll();
private slots:
&&& void send();
&&& void receive();&&&&
&&& void on_clearButton_clicked();
&&& void on_configButton_clicked();
&&& void on_exitButton_clicked();
&&& Ui::Widget *
&&& QUdpSocket *udpSocket1;&&
&&& bool configF
#endif // WIDGET_H
&&&&&&&&&II、&widget.cpp裏的核心代碼及說明:
首先初始化如下: ui-&setupUi(this);
&&& configFlag =&&&&&&& //初始化連接参數 为未連接
&&& 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.&))
&&&&&&&&&&&&&&&
&&&&&&&&&&& 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)
&&&&&&& QMessageB
&&&&&&& box.setText(tr(&初始化绑定socket錯誤!&));
&&&&&&& box.exec();
&&&&&&& 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聊天界面-------頂礼准提佛母&)); 設置標題。
&&&&&& (頂礼准提佛母,頂礼南師懷瑾,希望大家少殺生少吃肉,孝敬父母,多多貢獻源碼:
&南懷瑾老師傳承的准提心咒:,
&&&&&&&&&&&&& 南懷瑾老師念誦准提咒100遍30分钟版本:&&&&&&&&&&&&&&&
&&&&&&&&&&& 南懷瑾老師2002年香港准提法開示:
&&&&&&&&&& 南懷瑾老師教念的准提咒:&&&&&&&&&&&
&&&&&&&&& 金剛上師南公懷瑾傳授准提法修持要領開示(1978年9月):&)
&&& 南師慈悲叮嚀:持准提咒容易疏忽之處:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -------------不喜歡的敬請繞過。
三、發送數據的槽函數-----解决發送中文亂碼的關鍵
void Widget::send()
&&& autoScroll();
&&& QString sendStr = ui-&sendTextEdit-&toPlainText();
&&& QByteArray sendByteArray = sendStr.toAscii();
&&& QMessageB
&&& if(sendStr.length()==0)
&&&&&&& box.setText(tr(&請輸入發送內容&));
&&&&&&& box.exec();
&&& else if(configFlag)
&&&&&&& udpSocket1-&writeDatagram(sendByteArray, sendByteArray.length(), *remoteHostAddr, 6665);
&&&&&&& //本地發送信息再信息交互窗口的顯示
&&&&&&& QDateT
&&&&&&& 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,本地時間顯示
&&&&&& QDateT
&&&&&&& 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裏,點控件,設置屬性裏這麼設置。如果不設自動滾屏是什麼效果呢??
&&&&&&&& 只有拖動右邊滾動鼠標才能顯示,所以一定要設自動滾屏。而且在兩個地方,一個是receive裏調用這個函數,有東西顯示的時候,滾屏到最後顯示! 點發送的時候,也要調用這個滾屏函數,如果您聊天的時候,把光標停留在信息交互欄裏某個位置A,下一條信息就會顯示在A光標後,而不是我們希望的每次都挨着上一條信息後顯示。所以點發送按鈕後,要先調用,目的在此!
四、接收槽函數的實現
&void Widget::receive()
&&& while(udpSocket1-&hasPendingDatagrams())
&&&&&&& QTextCodec *tc=QTextCodec::codecForName(&UTF-8&);&//UTF-8
&&&&&&& QDateT
&&&&&&& QString timeStr = time.currentDateTime().toString(&yyyy-MM-dd hh:mm:ss ddd&);
&&&&&&& QByteA
&&&&&&& 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&&&端口號:&&&
&&& remoteHostAddr = new QHostAddress(remoteIpStr);
&&& QMessageB
&&& if(remoteIpStr.length()==0 || port.length()==0 || port.toInt()&1024)
&&&&&&& configFlag =
&&&&&&& box.setText(&請正確設置遠程端Ip地址和端口號!&);
&&&&&&& box.exec();
&&&&&&& configFlag =
&&&&&&& box.setText(&您設置的遠程端Ip:& + remoteIpStr+&端口號:&+port);
&&&&&&& box.exec();
用來初始化遠程Ip地址!
至此唯一不完美的是,如何为qt編寫的程序添加一個圖標?下午搞了一會,沒有成功!網上貌似說的都是在windows下,我要再linux下。哪位大神實現了指點一下後學。
源碼下載:
------分隔線----------------------------
平時我們創建Zip文件的時候,要麼用現成的軟件,要麼用第三方...
現在大多數使用Extjs的程序都使用Java來編寫後台服務器程序,下面...
在安裝C++軟件的時候,有時候安裝失敗提示“請確保二進...
在網上看到不少人民币大寫轉換的類,或多或少的總有一些問題...
前天,更換了一台新電腦,配置還行,就興沖沖的用上了32位的...
xp上搭建asp.net 網站。
已有的安裝順序OS-&VS 2010-&IIS 5.0qt语音私聊粘贴的图片发不过去怎么回事_百度知道
qt语音私聊粘贴的图片发不过去怎么回事
QT语音私聊是不能发图片的只能发文字哦。一般图片得公屏上面发哦,
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁QT怎么设置按住鼠标中键说话_百度经验
&&&&&&&&&电脑软件
分享有回报:
QT怎么设置按住鼠标中键说话
有时候在在QT和朋友聊天或者其他事时,不好按键盘说话,那么我们就设置成按住鼠标中键说话,怎么设置呢?下面介绍。
1.搜索下载安装QT语音,安装完毕后打开,输入QQ号、密码登录
2.点击我的房间进入房间,或者随便搜索一个房间进入
3.进入房间后,如果群管理下面是所以可以说话那么你就可以随意说话的,点击右下角按键说话,勾选按住鼠标说话,在后面的框里点击下鼠标中键就设置完成了、说话按住鼠标中键就可以了。
图片截图、文字为本人原创未经允许请勿转载~!
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
第1期你不知道的iPad技巧1270次分享
第1期win7电脑那些事2166次分享
第2期新人玩转百度经验332次分享
第1期Win8.1实用小技巧1021次分享
第1期小白装大神492次分享
请扫描分享到朋友圈御龙在天 游戏内怎摸有真人说话 我已经阻止QT语音 为什么还会听见游戏里有真人说话 如果要说话的话 要按字_百度知道
御龙在天 游戏内怎摸有真人说话 我已经阻止QT语音 为什么还会听见游戏里有真人说话 如果要说话的话 要按字
提问者采纳
你是打开了官方频道吧,点qt退出频道就可以了。还有就是指挥是自动开的,不想听可以点设置,音效,把qt的选项框点下就可以关闭
我没有下QT 而且在安装游戏时 我阻止了QT语音通信
怎摸还可以听到啊 还有
我要是想说话
让别人听到该怎样做
按什么键字
其他类似问题
按默认排序
其他1条回答
左边有个指挥
点开 把那个小喇叭关了就行了组个队可以说话
平时就听人说话
那个指挥有时候说玩法什么
听听也有用
开小点声不影响游戏
qt语音的相关知识
等待您来回答
您可能关注的推广回答者:
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 qt聊天室 的文章

 

随机推荐