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();
}