QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "memdb");
db.setDatabaseName(":memory:");
if (!db.open())
{
qDebug() << db.lastError().text();
// std::exit(1);
}
QSqlQuery q("", db);
q.exec("create table Universities (id integer primary key, Location varchar, Population integer)");
q.exec("insert into Universities values (0, 'MSK', 12000000)");
q.exec("insert into Universities values (1, 'NSK', 1600000)");
q.exec("insert into Universities values (2, 'SPB', 6000000)");
q.exec("insert into Universities values (3, 'PRM', 1000000)");
int sz = ui->tableWidget->rowCount();
QString queryString = "SELECT * FROM Universities WHERE Location IN (";
for(int i = 0; i < sz; ++i)
{
queryString += "?,";
}
queryString.back() = ')';
QSqlQuery query(queryString, db);
for(int i = 0; i < sz; ++i)
{
query.bindValue(i, ui->tableWidget->item(i, 0)->text());
}
if (!query.exec())
{
qDebug() << query.lastError().text();
// std::exit(1);
}
while(query.next())
{
qDebug() << query.value(0).toInt() << " "
<< query.value(1).toString() << " "
<< query.value(2).toInt() << "\n";
}
QSqlQuery query;
query.prepare("SELECT * FROM Universities WHERE Location IN (?)");
int sz = ui->tableWidget->rowCount();
QVariantList values;
for(int i = 0; i < sz; ++i)
{
values << ui->tableWidget->item(i, 0)->text();
}
query.addBindValue(values);
if (!query.execBatch())
{
qDebug() << query.lastError();
}
необходимо по двойному клику на запись удалять её из tableWidget
int i = ui->tableWidget->selectionModel()->currentIndex().row();
ui->tableWidget->removeRow(i);
void currencysViewDialog::getCurrenciesID(){
QModelIndex currensyIndex = ui->currenciesTableView->currentIndex();
int selectedRow = currensyIndex.row();
int selectedColumn = 0;
currensyCurrentID =ui->currenciesTableView->model()->data(ui->currenciesTableView->model()->index(selectedRow,selectedColumn)).toInt();
qDebug() << trUtf8("Current ID:") << currensyCurrentID;
}
void currencysViewDialog::currensiesModify(){
getCurrenciesID();
QSqlQuery *getCurrencies = new QSqlQuery;
getCurrencies->prepare("SELECT "
"currency_id, "
"currency_name, "
"currency_altname, "
"currency_rate, "
"currency_national, "
"currency_code "
"FROM "
"currencies "
"WHERE "
"deleted='false' "
"AND currency_id=:currensyCurrentID");
getCurrencies->bindValue(":currensyCurrentID",currensyCurrentID);
getCurrencies->exec();
// if(getCurrencies->lastError().isValid())
qDebug() << trUtf8("Запрос:") << getCurrencies->executedQuery();
qDebug() << trUtf8("Error:") << getCurrencies->lastError();
while(getCurrencies->next()){
currensyID = getCurrencies->value(0).toInt();
currensyName = getCurrencies->value(1).toString();
currensAltName = getCurrencies->value(2).toString();
currensyRate = getCurrencies->value(3).toDouble();
currensyNational = getCurrencies->value(4).toBool();
currensyCode = getCurrencies->value(5).toInt();
qDebug() << trUtf8("ID:") << currensyID;
qDebug() << trUtf8("Имя валюты:") << currensyName;
qDebug() << trUtf8("AltName:") << currensAltName;
qDebug() << trUtf8("Rate:") << currensyRate;
qDebug() << trUtf8("National:") << currensyNational;
qDebug() << trUtf8("Code:") << currensyCode;
}
currencysChangeDialog dialog(this);
dialog.currensiesEdit(currensyID,currensyName,currensAltName,currensyRate,currensyNational,currensyCode);
dialog.exec();
if(dialog.close())
getCurrenciesList();
}
select group_concat(if(v='a', c, null)) a,
group_concat(if(v='b', c, null)) b,
group_concat(if(v='c', c, null)) c
from (select value v, Count(value) c
from t1
group by value ) temp
QEventLoop loop;
QFutureWatcher watcher = QConcurrent::run(someFunc);
connect(&watcher, &QFutureWatcher::finished, &loop, &QEventLoop::quit);
loop.exec();
auto result = watcher.result();
алг рекурсия(узел: Узел)
длина_мас = 0
// Прогоним алгоритм для сыновей, рассчитаем длину массива
для всех сыновей (узел) → сын
рекурсия(сын) // ыгы, в основе банальный обход в глубину
длина_мас = макс(длина_мас, сын.границы.длина)
длина_мас = длина_мас + 1
разложить сыновей на плоскости, руководствуясь их массивами границ
и вашим чувством прекрасного; соответственно присвоить ИХ deltaX
(оставлю это как домашнее задание)
// Рассчитаем границы дли нашего узла
границы.установить_размер(длина_мас)
границы.заполнить(левая=+M, правая=—M)
полширины = узел.ширина / 2
границы[0] = (левая = −полширины, правая = узел.ширина − полширины)
для всех сыновей (узел) → сын
для i = [0 .. сын.границы.длина)
узел.границы[i+1].левая = мин(
узел.границы[i+1].левая, сын.границы[i].левая + сын.deltaX)
// если сыновья идут слева направо, этого хватает!
узел.границы[i+1].правая = сын.границы[i].правая + сын.deltaX
сын.границы.установить_размер(0) // массив больше не нужен
// Если же нужны точные координаты каждого узла…
алг уточнитьКоординаты(узел: Узел; Y: целое)
узел.коорд.Y = Y
Yсына = Y + высота_яруса
для всех сыновей (узел) → сын
сын.коорд.X = узел.коорд.X + сын.deltaX
уточнитьКоординаты(сын, Yсына)
QApplication a(argc, argv);
FmAutoriz au;
std::unique_ptr<SomeConnection> connection = au.exec(); // SomeConnection и exec придётся написать
if (connection) {
FmMain m(connection);
m.show();
return a.exec();
} else {
return 0;
}
std::unique_ptr<SomeConnection>FmAutoriz::exec()
{
bool b = QDialog::exec();
if (b) {
return std::move(this->connection);
// connection — поле FmAutoriz.
// Такой же unique_ptr, в обработчиках кнопок пытаемся создать соединение.
} else {
return nullptr;
}
}
void FmAutorize_on_btOk_click()
{
connection = new SomeConnection();
if (connection.connect(someLogin, somePassword)) {
accept();
} else {
// сообщи об ошибке
}
}