Qt client__server代码实现
在用QT做网络实验,client,server程序,按照官方教程刚开始出现了问题,只能本地端口通信,bridge连接的virutualbox中的机子不能和外面通信,搞了N久,终于发现了问题所在,代码如下
server
server.h
#ifndef server
#define server
#include <QDialog>
#include <QtNetwork>
class QLabel;
class QLineEdit;
class QPushButton;
class Server : public QDialog
{
Q_OBJECT
public:
Server(QWidget *parent = 0);
QLabel *ListenLabel;
QLineEdit *ListenLineEdit;
QPushButton *ListenButton;
QTcpServer *tcpServer;
QTcpSocket *tcpSocket;
private slots:
void mylisten();
void read();
void con();
};
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
server.cpp
#include <QtGui>
#include <QtNetwork>
#include "server.h"
Server :: Server(QWidget *parent)
:QDialog(parent)
{
QString str;
QHostInfo info = QHostInfo::fromName(QHostInfo::localHostName());
QHostAddress address = info.addresses().first();
str = address.toString();
QLabel *name = new QLabel(QString("my ip is: ") + str);
tcpServer = new QTcpServer;
ListenLabel = new QLabel(tr("Listen Port"));
ListenLineEdit = new QLineEdit;
ListenLineEdit->setValidator(new QIntValidator(1,65535, this));
ListenLabel->setBuddy(ListenLineEdit);
ListenButton = new QPushButton(tr("Listen"));
connect(ListenButton, SIGNAL(clicked()),
this, SLOT(mylisten()));
// tcpServer->listen(QHostAddress::LocalHost, 8000);
// connect(tcpServer, SIGNAL(newConnection()), this, SLOT(con()));
// QMessageBox::warning(NULL,"fe", "af", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QVBoxLayout *mm = new QVBoxLayout;
mm->addWidget(name);
mm->addWidget(ListenLabel);
mm->addWidget(ListenLineEdit);
mm->addWidget(ListenButton);
setLayout(mm);
}
void Server::mylisten()
{
QString port;
if(ListenLineEdit->text().isEmpty())
return;
port = ListenLineEdit->text();
tcpServer->listen(QHostAddress::Any, port.toUShort());//网上教程都是local,无疑两台机子不能通信,窘
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(con()));
}
void Server::con()
{
tcpSocket = tcpServer->nextPendingConnection();
// QMessageBox::warning(NULL,"fe", "af", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(read()));
}
void Server::read()
{
QByteArray byte;
byte = tcpSocket->readAll();
QDialog *mm = new QDialog;
unsigned short aa = tcpSocket->peerPort();
QLabel *port = new QLabel(QString("sender send Mesg throug his port is %1").arg(aa)); //peer send through the port
QLabel *address = new QLabel(QString("client Adderss is") + tcpSocket->peerAddress().toString());
QLabel *Message = new QLabel(QString("Message is: ") + QString(byte));
QGridLayout *bb = new QGridLayout;
bb->addWidget(port,0,0);
bb->addWidget(address,1,0);
bb->addWidget(Message,2,0);
mm->setLayout(bb);
mm->show();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
main.cpp
#include <QApplication>
#include "server.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Server mm;
mm.show();
return mm.exec();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Clinet端代码
client.h
#ifndef BLOCKINGCLIENT_H
#define BLOCKINGCLIENT_H
#include <QDialog>
#include <QtNetwork>
class QDialogButtonBox;
class QLabel;
class QLineEdit;
class QPushButton;
class Client : public QDialog
{
Q_OBJECT
public:
Client(QWidget *parent = 0);
private slots:
void sendMessage();
void send();
void con();
void wrong();
private:
QLabel *hostLabel;
QLabel *portLabel;
QLabel *MessageLabel;
QLabel *statusLabel;
QLineEdit *hostLineEdit;
QLineEdit *portLineEdit;
QLineEdit *MessageLineEdit;
QTcpSocket *socket;
QDialogButtonBox *buttonBox;
QPushButton *sendMessageButton;
QPushButton *connectButton;
};
#endif
////////////////////////////////////////////////////////////////////////////////////
client.cpp
#include <QtGui>
#include <QtNetwork>
#include "client.h"
Client::Client(QWidget *parent)
:QDialog(parent)
{
socket = new QTcpSocket;
hostLabel = new QLabel(tr("&Server name:"));
portLabel = new QLabel(tr("S&erver port"));
MessageLabel = new QLabel(tr("Message to send"));
statusLabel = new QLabel(tr("Would show the Error code"));
QString ipAddress;
hostLineEdit = new QLineEdit;
portLineEdit = new QLineEdit;
MessageLineEdit = new QLineEdit;
portLineEdit->setValidator(new QIntValidator(1, 65535,this));
hostLabel->setBuddy(hostLineEdit);
portLabel->setBuddy(portLineEdit);
MessageLabel->setBuddy(MessageLineEdit);
sendMessageButton = new QPushButton(tr("send"));
sendMessageButton->setEnabled(false);
connectButton = new QPushButton(tr("connect"));
buttonBox = new QDialogButtonBox;
buttonBox->addButton(connectButton, QDialogButtonBox::AcceptRole);
buttonBox->addButton(sendMessageButton,QDialogButtonBox:: AcceptRole);
connect(connectButton, SIGNAL(clicked()), this, SLOT(con()));
connect(sendMessageButton, SIGNAL(clicked()),
this, SLOT(sendMessage()));
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(hostLabel, 0, 0);
mainLayout->addWidget(hostLineEdit, 0, 1);
mainLayout->addWidget(portLabel, 1, 0);
mainLayout->addWidget(portLineEdit, 1, 1);
mainLayout->addWidget(MessageLabel, 2, 0);
mainLayout->addWidget(MessageLineEdit,2,1);
mainLayout->addWidget(buttonBox, 3,0,3,1);
mainLayout->addWidget(statusLabel,6,0);
setLayout(mainLayout);
setWindowTitle(tr("send client"));
}
void Client :: con()
{
QString host;
QString port;
QString Message;
if(hostLineEdit->text().isEmpty() || portLineEdit->text().isEmpty() || MessageLineEdit->text().isEmpty())
return;
host = hostLineEdit->text();
port = portLineEdit->text();
Message = MessageLineEdit->text();
// QMessageBox::warning(NULL, host, port, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
socket->connectToHost(host,port.toUShort());
// socket->connectToHost(QHostAddress::LocalHost,port.toUShort());
// socket->write(qPrintable(Message));
connect(socket, SIGNAL(connected()), this,SLOT(send()));
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(wrong()));
}
void Client::wrong()
{
statusLabel->setText(QString("Error code %1").arg(socket->error()));
}
void Client::send()
{
sendMessageButton->setEnabled(true);
}
void Client :: sendMessage()
{
QString Message;
Message = MessageLineEdit->text();
socket->write(qPrintable(Message));
}
////////////////////////////////////////////////////////////////////////////////////////////////
main.cpp
#include <QApplication>
#include "client.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Client kain;
kain.show();
return kain.exec();
}
还有就是在.pro文件中加上 QT += network不然什么TCPserver之类的找不到
QStandardItemModel数据更新,scroll unchanged
最近在写OS课设,一个系统monitor,
把进程的信息读入QStandardItemModel表
timer定时,更新数据,QStandardItemModel附在QTableView上
这时有个问题,如果我拖动滑动条,当更新时,它又会还原,最后终于找到了解决方法
在timer的SLOT(update)中,添加如下代码,即记住了更新前的位置,并在更新后还原。。。
int
last_position = tableView->verticalScrollBar()->value();
... some update...
tableView->verticalScrollBar()->setValue(position);