#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitTreeView();
InitServerCfg();
InitClientCfg();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitTreeView()
{
ui->treeWidget->setColumnCount(1);
ui->treeWidget->setHeaderLabel(tr("TCP 服务器"));
pServerItem = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("服务器")));// 添加QTreeWidget主节点;
pClientItem = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("客户端")));
QTreeWidgetItem *pServerItem_1 = new QTreeWidgetItem(pServerItem,QStringList(QString("配置管理")));
QTreeWidgetItem *pClientItem_1 = new QTreeWidgetItem(pClientItem,QStringList(QString("配置管理")));
connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(slot_itemDoubleClicked(QTreeWidgetItem*,int)));
ui->treeWidget->setCurrentItem(pServerItem_1);
ui->treeWidget->expandAll();
ui->stackedWidget->setCurrentIndex(0);
}
void MainWindow::InitServerCfg()
{
connect(&tcpServer,SIGNAL(incomingConnect(QString)),SLOT(slot_incomingConnect(QString)));
connect(&tcpServer,SIGNAL(readMessage(QString,QString)),SLOT(slot_readMessage(QString,QString)));
connect(&tcpServer,SIGNAL(disconnected(QString)),SLOT(slot_disconnected(QString)));
ui->pushButton_Start->setEnabled(true);
ui->pushButton_Close->setEnabled(false);
}
void MainWindow::InitClientCfg()
{
pClientModel = new QStandardItemModel();
ui->tableView_RecvAll->verticalHeader()->setVisible(false);
ui->tableView_RecvAll->horizontalHeader()->setVisible(false);
ui->tableView_RecvAll->setModel(pClientModel);
pClientModel->setColumnCount(2); //设置表格列数
ui->tableView_RecvAll->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableView_RecvAll->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
ui->tableView_RecvAll->setColumnWidth(0, 80);
ui->tableView_RecvAll->setEditTriggers(QAbstractItemView::NoEditTriggers);
MyCheckBox *pAllCheck = new MyCheckBox();
pAllCheck->setText("全选");
pAllCheck->SetIdentify("All");
connect(pAllCheck,SIGNAL(curStateChanged(QString,int)),this,SLOT(slot_curStateChanged(QString,int)));
pClientModel->setRowCount(1);
ui->tableView_RecvAll->setRowHeight(0,40);
ui->tableView_RecvAll->setIndexWidget(pClientModel->index(0,0),pAllCheck);
pClientModel->setItem(0, 1, new QStandardItem("客户端" ) );
ui->pushButton_SendAll->setEnabled(false);
ui->pushButton_CloseAll->setEnabled(false);
}
void MainWindow::slot_incomingConnect(QString socketID)
{
QTreeWidgetItem *pClientItem_N = new QTreeWidgetItem(pClientItem,QStringList(socketID));
pClientModel->setRowCount(pClientModel->rowCount()+1);
MyCheckBox *pOneCheck = new MyCheckBox();
pOneCheck->SetIdentify(socketID);
connect(pOneCheck,SIGNAL(curStateChanged(QString,int)),this,SLOT(slot_curStateChanged(QString,int)));
ui->tableView_RecvAll->setIndexWidget(pClientModel->index(pClientModel->rowCount()-1,0),pOneCheck);
pClientModel->setItem(pClientModel->rowCount()-1, 1, new QStandardItem(socketID) );
ui->tableView_RecvAll->setRowHeight(pClientModel->rowCount()-1,40);
}
void MainWindow::slot_readMessage(QString socketId, QString message)
{
QString sSocketID = "客户端[" + socketId + "]";
if(ui->label_Info->text() == sSocketID)
{
ui->textEdit_Recv->setText(message);
}
}
void MainWindow::slot_disconnected(QString socketId)
{
for(int i=0; i<pClientItem->childCount(); i++)
{
if(pClientItem->child(i)->text(0) == socketId)
{
pClientItem->removeChild(pClientItem->child(i));
break;
}
}
for(int i=1; i<pClientModel->rowCount(); i++)
{
if(socketId == pClientModel->item(i,1)->text())
{
pClientModel->removeRow(i);
}
}
ui->treeWidget->setCurrentItem(pClientItem->child(0));
ui->stackedWidget->setCurrentIndex(1);
}
void MainWindow::slot_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
if(NULL == item->parent()) { return; }
if(item->parent() == pServerItem)
{
ui->stackedWidget->setCurrentIndex(0);
return;
}
if("配置管理" == item->text(0))
{
ui->stackedWidget->setCurrentIndex(1);
return;
}
QString sTitleMsg = "客户端[" + item->text(0) + "]";
ui->label_Info->setText(sTitleMsg);
ui->stackedWidget->setCurrentIndex(2);
ui->textEdit_Send->clear();
ui->textEdit_Recv->setText(tcpServer.GetRecvMesg(item->text(0)));
}
void MainWindow::slot_curStateChanged(QString identify, int state)
{
if("All" != identify) { return; }
MyCheckBox *pCheckBox;
for(int i=1; i<pClientModel->rowCount(); i++)
{
pCheckBox = (MyCheckBox*)ui->tableView_RecvAll->indexWidget(pClientModel->index(i,0));
switch(state)
{
case 0: pCheckBox->setChecked(false); break;
case 2: pCheckBox->setChecked(true); break;
default:break;
}
}
}
void MainWindow::on_pushButton_Start_clicked()
{
ui->label_ServerSts->setText("");
if(!tcpServer.listen(QHostAddress::Any,ui->spinBox_Port->value()))
{
ui->label_ServerSts->setText("Failed to bind port !");
return;
}
ui->pushButton_Start->setEnabled(false);
ui->pushButton_Close->setEnabled(true);
ui->pushButton_SendAll->setEnabled(true);
ui->pushButton_CloseAll->setEnabled(true);
}
void MainWindow::on_pushButton_Close_clicked()
{
tcpServer.close();
tcpServer.ClearClientAll();
ui->pushButton_Start->setEnabled(true);
ui->pushButton_Close->setEnabled(false);
ui->pushButton_SendAll->setEnabled(false);
ui->pushButton_CloseAll->setEnabled(false);
}
void MainWindow::on_pushButton_Send_clicked()
{
QString sSocketID = ui->label_Info->text();
sSocketID = sSocketID.mid(sSocketID.indexOf("[")+1,sSocketID.lastIndexOf("]") - sSocketID.indexOf("[")-1);
tcpServer.SendMessage(sSocketID,ui->textEdit_Send->toPlainText());
ui->textEdit_Send->clear();
ui->textEdit_Recv->setText(tcpServer.GetRecvMesg(sSocketID));
}
void MainWindow::on_pushButton_SendAll_clicked()
{
if("" == ui->textEdit_RecvAll->toPlainText()) { return; }
MyCheckBox *pCheckBox;
for(int i=1; i<pClientModel->rowCount(); i++)
{
pCheckBox = (MyCheckBox*)ui->tableView_RecvAll->indexWidget(pClientModel->index(i,0));
switch(pCheckBox->checkState())
{
case Qt::Checked :
{
tcpServer.SendMessage(pClientModel->item(i,1)->text(),ui->textEdit_RecvAll->toPlainText());
}break;
default:break;
}
}
}
void MainWindow::on_pushButton_CloseAll_clicked()
{
MyCheckBox *pCheckBox;
for(int i=1; i<pClientModel->rowCount(); i++)
{
pCheckBox = (MyCheckBox*)ui->tableView_RecvAll->indexWidget(pClientModel->index(i,0));
switch(pCheckBox->checkState())
{
case Qt::Checked :
{
tcpServer.CloseSocket(pClientModel->item(i,1)->text());
}break;
default:break;
}
}
}