gusucode.com > qt实现的多线程服务器和客户端源码程序 > qt实现的多线程服务器和客户端源码程序/qtserver/client/logindialog.cpp
#include <QtGui> #include <QtCore> #include "logindialog.h" //! [0] LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent) { topLabel = new QLabel("测试链接。。。"); nameLabel = new QLabel("用户名"); nameLineEdit = new QLineEdit; nameLabel->setBuddy(nameLineEdit); passLabel = new QLabel("密码"); passLineEdit = new QLineEdit; passLabel->setBuddy(passLineEdit); passLineEdit->setEchoMode(QLineEdit::Password); addLabel = new QLabel("服务器地址"); addLineEdit = new QLineEdit; addLabel->setBuddy(addLineEdit); portLabel = new QLabel("端口号"); portLineEdit = new QLineEdit; portLabel->setBuddy(portLineEdit); //! [1] sumitButton = new QPushButton("登录"); sumitButton->setDefault(true); moreButton = new QPushButton("配置"); moreButton->setCheckable(true); moreButton->setAutoDefault(false); saveButton = new QPushButton("保存"); // saveButton->setCheckable(true); saveButton->setAutoDefault(false); buttonBox = new QDialogButtonBox(Qt::Vertical); buttonBox->addButton(sumitButton, QDialogButtonBox::ActionRole); buttonBox->addButton(moreButton, QDialogButtonBox::ActionRole); //! [1] progressBar = new QProgressBar(); progressBar->setMinimum(0); progressBar->setMaximum(100); progressBar->setOrientation(Qt::Horizontal); //! [2] loginWgt = new QWidget; //! [3] connect(&tcpSocket, SIGNAL(connected()), this, SLOT(sendRequest())); connect(&tcpSocket, SIGNAL(disconnected()), this, SLOT(connectionClosedByServer())); connect(&tcpSocket, SIGNAL(readyRead()), this, SLOT(readServer())); connect(&tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error())); connect(moreButton, SIGNAL(toggled(bool)), loginWgt, SLOT(setVisible(bool))); connect(sumitButton, SIGNAL(clicked()), this, SLOT(on_sumitButton_accepted())); connect(saveButton, SIGNAL(clicked()), this, SLOT(save_addport())); QGridLayout *loginWgtLayout = new QGridLayout; loginWgtLayout->setMargin(0); loginWgtLayout->addWidget(addLabel,0,0); loginWgtLayout->addWidget(addLineEdit,0,1); loginWgtLayout->addWidget(portLabel,1,0); loginWgtLayout->addWidget(portLineEdit,1,1); loginWgtLayout->addWidget(saveButton,2,0,1,2); loginWgt->setLayout(loginWgtLayout); //! [3] //! [4] QGridLayout *topLeftLayout = new QGridLayout; topLeftLayout->addWidget(topLabel,0,0,1,2); topLeftLayout->addWidget(nameLabel,1,0); topLeftLayout->addWidget(nameLineEdit,1,1); topLeftLayout->addWidget(passLabel,2,0); topLeftLayout->addWidget(passLineEdit,2,1); topLeftLayout->addWidget(progressBar,3,0,1,2); QGridLayout *mainLayout = new QGridLayout; mainLayout->setSizeConstraint(QLayout::SetFixedSize); mainLayout->addLayout(topLeftLayout, 0, 0); mainLayout->addWidget(buttonBox, 0, 1); mainLayout->addWidget(loginWgt, 1, 0, 1, 2); setLayout(mainLayout); setWindowTitle("系统登录"); //! [4] //! [5] loginWgt->hide(); progressBar->hide(); init_addport(); connectToServer(); } //! [5] void LoginDialog::on_sumitButton_accepted() { if (nameLineEdit->text().isEmpty()) { topLabel->setText("用户名不能为空"); nameLineEdit->setFocus(); return; } if (passLineEdit->text().isEmpty()) { topLabel->setText("密码不能为空"); passLineEdit->setFocus(); return; } QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_3); out << quint16(0) << quint8('L') << QString("select id from _users where username='%1' and password=%2") .arg(nameLineEdit->text()).arg(passLineEdit->text()); out.device()->seek(0); out << quint16(block.size() - sizeof(quint16)); tcpSocket.write(block); topLabel->setText(nameLineEdit->text()); // progressBar->show(); } void LoginDialog::init_addport() { QFile file("client.cfg"); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); int flag = 1; while (!file.atEnd()) { QByteArray line = file.readLine(); if (flag == 1){ addLineEdit->setText(line); }else if(flag==2){ portLineEdit->setText(line); } flag++; } file.close(); } } void LoginDialog::save_addport() { QFile file("client.cfg"); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); out << addLineEdit->text() << endl; out << portLineEdit->text() << endl; file.close(); } } void LoginDialog::connectToServer() { // tcpSocket.connectToHost(QHostAddress::LocalHost, 6178); tcpSocket.connectToHost(addLineEdit->text(), portLineEdit->text().toInt()); nextBlockSize = 0; } void LoginDialog::sendRequest() { topLabel->setText("服务器链接正常,请登录。"); } void LoginDialog::readServer() { QDataStream in(&tcpSocket); in.setVersion(QDataStream::Qt_4_3); forever { if (nextBlockSize == 0) { if (tcpSocket.bytesAvailable() < sizeof(quint16)) break; in >> nextBlockSize; } if (nextBlockSize == 0xFFFF) { topLabel->setText(tr("Found trip(s)")); break; } if (tcpSocket.bytesAvailable() < nextBlockSize) break; QString result; in >> result; if(result == "LTRUE"){ tcpSocket.close(); accept(); break; }else if(result == "LFALSE"){ nextBlockSize = 0; topLabel->setText("用户名或密码不正确!"); nameLineEdit->setFocus(); nameLineEdit->selectAll(); break; } } } void LoginDialog::connectionClosedByServer() { if (nextBlockSize != 0xFFFF) topLabel->setText("用户名或密码不正确!"); nameLineEdit->setFocus(); nameLineEdit->selectAll(); } void LoginDialog::error() { topLabel->setText(tcpSocket.errorString()); tcpSocket.close(); }