sqlRoutine sql; QThread *Thread; Thread = new QThread(); // не должно быть родителя! sql.moveToThread(Thread); Thread->start(); ClientBase CB; CB.show(); //Эта связка запрашивает некоторое кол-во строк из таблицы (с какой-то по какую то). В ответ строка с текстом ошибки ( или пустая, если всё ок). QObject::connect(&CB,SIGNAL(GetClientTableData(quint32, quint32)),&sql,SLOT(RequestedClientTableData(quint32, quint32))); QObject::connect(&sql,SIGNAL(ReturnClientTableData(QString)),&CB,SLOT(RefreshClientTableData(QString))); //Здесь спрашиваем у БД, сколько записей в таблице и возвращаем количество в поток с интерфейсом. По возвращению, вешаем QSqlQueryModel на QTableView (setModel) QObject::connect(&CB,SIGNAL(GetClientsCount()),&sql,SLOT(RequestedClientsCount())); QObject::connect(&sql,SIGNAL(ReturnClientsCount(int)),&CB,SLOT(RefreshClientsCount(int)));
db = QSqlDatabase::addDatabase("QODBC3"); db.setDatabaseName("DRIVER={SQL Server};Server=172.22.121.2;Database=xxx_test;Uid=xxxx;Port=1433;Pwd=xxxxx;"); bool ok = db.open(); user_struct currentUser; if (ok) //Корректное открытие объекта базы данных { // тут проверяем введённый логин и пароль, отправляем куда-то там сигнал о результате (объект, отвечающий за форму логина, тут не описывается) } else { //если не открыли - ошибка с сигналом (в тот же неописанный объект) }
void sqlRoutine::RequestedClientsCount(){ bool ok = query->exec("SELECT COUNT(*) FROM ClientsTable"); if (ok) //Запрос корректно сформирован и исполнен { query->first(); int Result = query->value(0).toInt(); emit ReturnClientsCount(Result); } else { emit ReturnClientsCount(-1); }}void sqlRoutine::RequestedClientTableData(quint32 FromEntryNum, quint32 ToEntryNum){ model.setQuery("SELECT Client_ID,FullName,PhoneNumber,LastCallDate,LastCallTime " "FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY Client_ID) AS row FROM ClientsTable) a " "WHERE row > "+QString::number(FromEntryNum)+" AND row <= "+QString::number(ToEntryNum)); QString errorString = model.lastError().text(); emit ReturnClientTableData(errorString);}
void ClientBase::RefreshClientTableData(QString SqlError){ if (SqlError == " " ) { WaitingForAnswer = false; } else { msgBox2= new QMessageBox("Ошибка", SqlError,QMessageBox::NoIcon,0,0,0,0,Qt::Dialog); msgBox2->setAttribute(Qt::WA_DeleteOnClose, true); msgBox2->show(); }}void ClientBase::RefreshClientsCount(int RowCount){ TotalEntryCount = RowCount; ui->TotoalCountLabel->setText(QString::number(TotalEntryCount)); if (TotalEntryCount<=PageSize) { ui->NextPageButton->setEnabled(false); } if (FirstRequest) //Первый раз заполняем таблицу { FirstRequest = false; emit GetClientTableData(0, (TotalEntryCount<PageSize)? TotalEntryCount:PageSize); sql.model.setHeaderData(0, Qt::Horizontal, tr("ID")); sql.model.setHeaderData(1, Qt::Horizontal, tr("Имя")); sql.model.setHeaderData(2, Qt::Horizontal, tr("Телефон")); sql.model.setHeaderData(3, Qt::Horizontal, tr("Дата звонка")); sql.model.setHeaderData(4, Qt::Horizontal, tr("Время звонка")); sql.model.setHeaderData(5, Qt::Horizontal, tr("Статус")); ui->ClientBaseTableWidget->setModel(&(sql.model)); refreshPageInfo(); //тут просто вывод в QLabel номеров записей на текущей странице. }}
void ClientBase::on_NextPageButton_clicked(){ PageNum++; if (PageNum*PageSize +PageSize > TotalEntryCount) { ui->NextPageButton->setEnabled(false); } ui->PrevPageButton->setEnabled(true); emit GetClientTableData(PageNum*PageSize, (TotalEntryCount<PageNum*PageSize+PageSize)? TotalEntryCount:PageNum*PageSize+PageSize); refreshPageInfo();}void ClientBase::on_PrevPageButton_clicked(){ PageNum--; if (PageNum == 0) { ui->PrevPageButton->setEnabled(false); } ui->NextPageButton->setEnabled(true); emit GetClientTableData(PageNum*PageSize, (TotalEntryCount<PageNum*PageSize+PageSize)? TotalEntryCount:PageNum*PageSize+PageSize); refreshPageInfo();}