CODE
class Database : public QThread
{
private:
QSqlDatabase *db;
public:
Database();
~Database();
void run();
void initDatabase(QString user, QString pass);
public slots:
void sqlExec(Command *);
};
CODE
Database::Database()
{
}
void Database::run()
{
db =new QSqlDatabase::addDatabase("QPSQL");
db->setHostName("192.168.1.2");
db->setDatabaseName("dreamservice");
db->setUserName("me");
db->setPassword("123456");
if(!db->open())
{
qDebug() << "Error opening bd";
}
this->exec();
}
void Database::sqlExec(Command *command)
{
if(!command->start(db))
{
}
}
Database::~Database()
{
}
CODE
class Command : public QObject
{
Q_OBJECT
public:
Command();
~Command();
virtual bool startCommand(QSqlDatabase *db);
};
class CommandRequestList : public Command
{
Q_OBJECT
private:
QSqlQuery *sqlQuery;
public:
CommandRequestList();
~CommandRequestList();
void setAttributes(int id);
bool startCommand(QSqlDatabase *db);
};
CommandRequestList::CommandRequestList()
{
}
CommandRequestList::~CommandRequestList()
{
}
bool CommandRequestList::startCommand(QSqlDatabase *db)
{
if (db != 0)
{
sqlQuery = new QSqlQuery(*db);
QString query = "SELECT request.id_request, cl.company_name, agr.arg_service, request.status, request.tdate_create FROM repair_request request, agreement agr, client cl WHERE (request.id_agreement = agr.id_agr) AND (agr.id_client = cl.id_client)";
if (!sqlQuery->exec(query))
{
QSqlError qwe = sqlQuery->lastError();
}
delete sqlQuery;
}
return true;
}
Вопросов 2:
1) db =new QSqlDatabase::addDatabase("QPSQL"); не работает =(( Я так понимаю что надо или разименование, или создавать объект? Но ведь для того чтобы он выполнялся в отдельном потоке он должен создаваться в секции run ??
2) Реально ли реализовать то что здесь описанно, в смысле.. правильном ли путём иду? Тоесть ещё раз если в кратце:
два потока - главный gui и поток работы с бд. Например при щелчке по форме с поиском вызывается слот который задаёт в соответствующий класс наследованный от Command нужные значения и высылает сигнал с указателем на этот класс. Этот сигнал соединяется со слотом из потока по работе бд sqlExex, в котором потом вызывается Command.startCommand(QSqlDatabase *db) внутри которого создаётся QSqlQuery и идёт вся работа запроса с базой.