• 5643阅读
  • 7回复

各位大神。这个怎么解决?求答案。 [复制链接]

上一主题 下一主题
离线cti0000
 
只看楼主 倒序阅读 楼主  发表于: 2012-07-30
Starting C:\Qt\2009.05\qt\OfficeChat\QQ\Server\debug\Server.exe...
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC
Delete CriticalSection spin count
离线cti0000
只看该作者 1楼 发表于: 2012-07-30
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtNetwork>
#include <QUdpSocket>
namespace Ui {
    class Widget;
}
enum MessageType{Message,NewParticipant,ParticipantLeft,Load,Reg_User,Send_File,Refuse};
class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QUdpSocket *socket;
    int port;
    int sendport;
public slots:
    void processPendingDatagrams();
    void sendMessage(MessageType type,QString serverAddress="",QString state="");
    void update_online_user(QString,QString);
    void del_online_user(QString);
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
离线cti0000
只看该作者 2楼 发表于: 2012-07-30
#ifndef DATEBASE_H
#define DATEBASE_H
#include <QSqlDatabase>
bool CreateConnect()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("qq");
    db.setUserName("root");
    db.setPassword("123");
    if(!db.open())
    {
        return false;
    }
    return true;
}

#endif // DATEBASE_H
离线cti0000
只看该作者 3楼 发表于: 2012-07-30
#include <QtGui/QApplication>
#include "widget.h"
#include <QTextCodec>
#include "datebase.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    if(!CreateConnect())
    {
       return 0;
    }
    Widget w;
    w.show();

    return a.exec();
}
离线cti0000
只看该作者 4楼 发表于: 2012-07-30
#include "widget.h"
#include "ui_widget.h"
#include <QSqlQuery>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    port = 8000;
    sendport = 8001;
    socket = new QUdpSocket();
    socket->bind(port,QUdpSocket::ShareAddress
                 | QUdpSocket::ReuseAddressHint);
    connect(socket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
    ui->tableWidget->setColumnCount(2);
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    ui->tableWidget->verticalHeader()->setHidden(true);
    QStringList header;
    header << tr("username") <<tr("ipAddress");
    ui->tableWidget->setHorizontalHeaderLabels(header);
    ui->tableWidget->setSortingEnabled(true);

}

Widget::~Widget()
{
    qDebug()<<"finish";
    delete ui;
}
void Widget::processPendingDatagrams()
{
    while(socket->hasPendingDatagrams())
        {
            QByteArray datagram;
            datagram.resize(socket->pendingDatagramSize());
            socket->readDatagram(datagram.data(),datagram.size());
            QDataStream in(&datagram,QIODevice::ReadOnly);
            int messageType;
            in >> messageType;
            switch(messageType)
            {
                case Message:
                {
                    QString send_user,rec_ip,send_msg;

                    in >> send_user >>rec_ip >>send_msg;
                    qDebug()<<send_user <<rec_ip<<send_msg;
                    sendMessage(Message,rec_ip,tr("%1/%2").arg(send_user).arg(send_msg));
                    break;
                }
                case NewParticipant:
                {
                    QString username,address;
                    in >>username >>address;
                    update_online_user(username,address);
                    break;
                }
                case ParticipantLeft:
                {
                    QString username;
                    in >> username;
                    del_online_user(username);
                    break;
                }
                case Load:
                {
                    QString username,pwd,ipAddress;
                    in >> username >> pwd >> ipAddress;
//                    qDebug()<<username<<pwd<<ipAddress;
                    QSqlQuery query;
                    query.prepare("select * from user where username="+tr("'%1'").arg(username));
//                    qDebug()<<"select * from user where username="+tr("%1").arg(username);
                    query.exec();
                    if(query.next())
                    {
                        if(pwd==query.value(1).toString())//用户名密码正确
                        {
                            //验证用户是否已经登录
                            if(ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
                                sendMessage(Load,ipAddress,tr("succ"));
                            else
                                sendMessage(Load,ipAddress,tr("online"));
                        }
                        else//密码错误
                        {
                            sendMessage(Load,ipAddress,tr("pwdErro"));
                        }
                    }
                    else//用户名不存在
                    {
                        sendMessage(Load,ipAddress,tr("userErro"));
                    }
                    break;
                }
            case Reg_User:
            {
                QString username,pwd,address;
                in >>username >>pwd >> address;
//                qDebug()<<username<<pwd<<address;
                QSqlQuery query;
                query.prepare("select * from user where username="+tr("'%1'").arg(username));
                query.exec();
                if(query.next())
                {
                    sendMessage(Reg_User,address,tr("false"));
                    return;
                }
                 query.prepare("insert into user values("+tr("'%1','%2')").arg(username).arg(pwd));
//                 qDebug()<<"insert into user values("+tr("'%1','%2')").arg(username).arg(pwd);
                 if(query.exec())
                    sendMessage(Reg_User,address,tr("succ"));
                 else
                    sendMessage(Reg_User,address,tr("overtime"));
                 break;
            }
            case Send_File:
            {
                QString username,rec_ip,filename,lisport;
                in >>username >>rec_ip >>filename >>lisport;
                sendMessage(Send_File,rec_ip,tr("%1/%2/%3").arg(username).arg(filename).arg(lisport));
                break;
            }
            case Refuse:
            {
                QString send_name,ipaddress;
                in >>send_name>>ipaddress;
                sendMessage(Refuse,ipaddress,send_name);
                break;
            }
            default:
            {
                break;
            }
            }
        }
}
void Widget::sendMessage(MessageType type, QString ipAddress, QString state)
{
    qDebug()<<type<<ipAddress<<state;
    qDebug()<<state;
    QByteArray data;
    QDataStream out(&data,QIODevice::WriteOnly);
    out << type;
    switch(type)
    {
        case Message:
        {
            out << state.split("/").at(0);
            out << state.right(state.length()-state.indexOf("/")-1);
            break;
        }
        case NewParticipant:
        {
            out << state.split("/").at(0) << state.split("/").at(1);
            break;
        }
        case ParticipantLeft:
        {
            out << state;
            break;
        }
        case Load:
        {
            out << state;            
            break;
        }
        case Reg_User:
        {
            out << state;
            break;
        }
        case Send_File:
        {
            out <<state.split("/").at(0)<<state.split("/").at(1)<< state.split("/").at(2);

            break;
        }
        case Refuse:
        {
            out <<state;
            break;
        }
        default:
        {
            break;
        }

    }
    socket->writeDatagram(data.data(),data.length(),QHostAddress(ipAddress),sendport);
}
void Widget::update_online_user(QString username, QString ipaddress)
{
   if(ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
   {
       int row = ui->tableWidget->rowCount();
       ui->tableWidget->insertRow(row);
       ui->tableWidget->setItem(row,0,(new QTableWidgetItem(username)));
       ui->tableWidget->setItem(row,1,(new QTableWidgetItem(ipaddress)));
       sendMessage(NewParticipant,tr("192.168.0.255"),tr("%1/%2").arg(username).arg(ipaddress));
   }
}
void Widget::del_online_user(QString username)
{
    qDebug()<<"delete "<<username;
    if(!ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
    {
        int row = ui->tableWidget->findItems(username,Qt::MatchExactly).first()->row();
        ui->tableWidget->removeRow(row);
        sendMessage(ParticipantLeft,tr("192.168.0.255"),username);
    }

}
离线cti0000
只看该作者 5楼 发表于: 2012-07-30
求解决。。。。
离线0xffffh

只看该作者 6楼 发表于: 2012-07-30
Starting C:\Qt\2009.05\qt\OfficeChat\QQ\Server\debug\Server.exe...
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC
Delete CriticalSection spin count

上面这段话告诉你没有MYSQL的Driver,默认Qt只有sqlite的,你可以
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
要想链接MySQL需要自己编译MYSQL的driver。
离线cti0000
只看该作者 7楼 发表于: 2012-07-31
回 6楼(0xffffh) 的帖子
我试过编译。但是不成功。
快速回复
限100 字节
 
上一个 下一个