Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
QtでIRCクライアント作ってみた
@luyikei
自己紹介
●
@luyikei です。
● https://twitter.com/luyikei
●
まず最初に・・・
●
プロジェクトを作成します
●
例ではプロジェクト名はQtestIRCでやります
●
ターゲット!!
Freenode の #luyikei 
まずは UI を作成しましょう
部品
● QPushButton : connectButton
● QPushButton : disconnectButton
● QLineInput : inputLineEdit
● QPushButton : submitButto...
Log と Message 完全分離(雑)
●
TabWidget を使って Log と Message を振り分け
る。
→これによってログを綺麗に表示する手間が省
ける(爆)
ヘッダーファイル
●
IRC も所詮ただの socket を使った簡易チャット
システム
●
でも便利
● private:
QTcpSocket *socket; // IRC 通信用
QStandardItemModel *model; /...
ヘッダーファイル 2
● private slots:
void readData(); // socket の IRC メッセージ取得用 SLOT
void connectToServer(); // connectButton の SLOT...
まずは MainWindow::MainWindow から
socket = new QTcpSocket(this);
connect(socket,SIGNAL(readyRead()),this,SLOT(readData()));
co...
まずは connectToServer ()から
socket->connectToHost(QString("chat.freenode.net"),6665); /* freenode に接
続 */
socket->write("USER...
IRC の書式① 接続編
USER <username> <user's mode> <unused> <real name>
※ クライアントが新しく接続する場合に使います。
例(雑):
USER QtestIRC QtestIRC Qtes...
IRC の書式② 入室編
JOIN <ルーム名>
例:
JOIN #luyikei
sendMessage()
QString toSend = QString("PRIVMSG #luyikei %1 n").arg(ui->inputLineEdit->text()); // 送信す
る IRC コマンド
socket->...
IRC の書式② 文字送信編
PRIVMSG <ルーム名> <メッセージ>
例:
PRIVMSG #luyikei HELLO!!
readData()
QString readLine = socket->readLine(); // IRC サーバーから送られたメッセージを取得
ui->LogView->append(readLine); // logView にぶちこ...
IRC の書式③ 文字取得編
●
例:
:luyikei__!~luyikei@124x35x199x106.ap124.ftth.ucom.ne.jp PRIVMSG #luyikei :test
つまり・・・
:<nickname>!~<ホ...
disconnectFromServer()
socket->flush(); // バッファに溜まっているメッセージを送信
socket->disconnect(); // 切断!!
終わり!
Upcoming SlideShare
Loading in …5
×

Qt でIRCクライアント作ってみた

1,056 views

Published on

Qt でIRCクライアント作ってみた。 Qt勉強会 @ 東京

  • Be the first to comment

Qt でIRCクライアント作ってみた

  1. 1. QtでIRCクライアント作ってみた @luyikei
  2. 2. 自己紹介 ● @luyikei です。 ● https://twitter.com/luyikei ●
  3. 3. まず最初に・・・ ● プロジェクトを作成します ● 例ではプロジェクト名はQtestIRCでやります ● ターゲット!! Freenode の #luyikei 
  4. 4. まずは UI を作成しましょう
  5. 5. 部品 ● QPushButton : connectButton ● QPushButton : disconnectButton ● QLineInput : inputLineEdit ● QPushButton : submitButton ● QTabWidget ● QTableVIew : messageView ● QTextEdit : logView
  6. 6. Log と Message 完全分離(雑) ● TabWidget を使って Log と Message を振り分け る。 →これによってログを綺麗に表示する手間が省 ける(爆)
  7. 7. ヘッダーファイル ● IRC も所詮ただの socket を使った簡易チャット システム ● でも便利 ● private: QTcpSocket *socket; // IRC 通信用 QStandardItemModel *model; // messageView
  8. 8. ヘッダーファイル 2 ● private slots: void readData(); // socket の IRC メッセージ取得用 SLOT void connectToServer(); // connectButton の SLOT void disconnectFromServer(); /* disconnectButton の SLOT */ void sendMessage(); // submitButton の SLOT
  9. 9. まずは MainWindow::MainWindow から socket = new QTcpSocket(this); connect(socket,SIGNAL(readyRead()),this,SLOT(readData())); connect(ui->connectButton,SIGNAL(clicked()),this,SLOT(connectToServer())); connect(ui- >disconnectButton,SIGNAL(clicked()),this,SLOT(disconnectFromServer())); connect(ui->submitButton,SIGNAL(clicked()),this,SLOT(sendMessage())); model = new QStandardItemModel(0,1,this); model->setHorizontalHeaderItem(0,new QStandardItem("Username")); model->setHorizontalHeaderItem(1,new QStandardItem("Message")); ui->messageView->setModel(model);
  10. 10. まずは connectToServer ()から socket->connectToHost(QString("chat.freenode.net"),6665); /* freenode に接 続 */ socket->write("USER QtestIRC QtestIRC QtestIRC QtestIRC n"); /* USER を 登録 */ socket->write("NICK QtestIRC n"); // ニック を登録 socket->write("JOIN #luyikei n"); // #luyikei に入室
  11. 11. IRC の書式① 接続編 USER <username> <user's mode> <unused> <real name> ※ クライアントが新しく接続する場合に使います。 例(雑): USER QtestIRC QtestIRC QtestIRC QtestIRC ______________________________________________________________________ NICK <nickname> ※ ニックネームを設定します 例(雑): NICK QtestIRC
  12. 12. IRC の書式② 入室編 JOIN <ルーム名> 例: JOIN #luyikei
  13. 13. sendMessage() QString toSend = QString("PRIVMSG #luyikei %1 n").arg(ui->inputLineEdit->text()); // 送信す る IRC コマンド socket->write(toSend.toUtf8().data()); // socket に write つまり送信 int row = model->rowCount(); // 追加する Item の列番号を取得 // messageView に追加する Username と Message modelに設定 model->setItem(row,0,new QStandardItem(QString("QtestIRC"))); model->setItem(row,1,new QStandardItem(ui->inputLineEdit->text())); // 一応ログにも追加 ui->logView->append(toSend); // inputLineEditを綺麗に ui->inputLineEdit->clear();
  14. 14. IRC の書式② 文字送信編 PRIVMSG <ルーム名> <メッセージ> 例: PRIVMSG #luyikei HELLO!!
  15. 15. readData() QString readLine = socket->readLine(); // IRC サーバーから送られたメッセージを取得 ui->LogView->append(readLine); // logView にぶちこむ if(!(readLine.indexOf("PRIVMSG") == -1 )){ // メッセージか判定 QString msg = readLine.split(":").last(); // メッセージを取得 QString tmp = readLine.split("!~").first(); QString username = tmp.right(tmp.size()-1); // ユーザー名を取得 int row = model->rowCount(); model->setItem(row,0,new QStandardItem(QString(username))); model->setItem(row,1,new QStandardItem(QString(msg))); } if(socket->canReadLine()) readData(); // もしメッセージが残っている場合引き続き取得 再帰
  16. 16. IRC の書式③ 文字取得編 ● 例: :luyikei__!~luyikei@124x35x199x106.ap124.ftth.ucom.ne.jp PRIVMSG #luyikei :test つまり・・・ :<nickname>!~<ホスト名> PRIVMSG <ルーム名> :<メッセージ> として送られてくるのだ!
  17. 17. disconnectFromServer() socket->flush(); // バッファに溜まっているメッセージを送信 socket->disconnect(); // 切断!!
  18. 18. 終わり!

×