Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457

Qt приложение как mysql клиент

04.01.2016, 17:05. Показов 5799. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пишу не совсем с нуля, читаю доки и примеры, найденные на просторах инета\рунета.

пока возникли два вопроса:
1 вопрос:
имеется QTablewidget tw
на него привязан код в mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow){
    ui->setupUi(this);
    ui->tw->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
    //Подключение к серверу БД и авторизация
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("192.168.7.1");
    db.setPort(3306);
    db.setDatabaseName("BD_BP");
    db.setUserName("userbp");
    db.setPassword("23165764aq23e");
    //Если подключиться удалось...
    if (db.open()){
        for (int i=0; i<2; i++) ui->tw->insertColumn(i);
        QSqlQuery q;
        q.exec("select login, passwd from `User`"); q.first();
        while (q.next()){
            ui->tw->insertRow(ui->tw->rowCount());
            for (int i=0; i<2; i++){
                QTableWidgetItem * item = new QTableWidgetItem(q.value(i).toString());
                ui->tw->setItem(ui->tw->rowCount()-1,i,item);
            }
        }
    }else{ //Если нет - выводим сообщение об ошибке
        ui->tw->insertRow(0); ui->tw->insertColumn(0);
        QTableWidgetItem * item = new QTableWidgetItem("Error: "+db.lastError().text());
        ui->tw->setItem(0,0,item);
    }
}
MainWindow::~MainWindow(){
    delete ui;
}
все работает, кроме отображения первого элемента в таблице. в чем может быть проблема?
какие параметры тока не менял, либо не отображает ничего, либо отображает 8 пустых строк. а в базе 9 строк(от 0 до 8)

2 вопрос:
тут пара ньюансов:
есть основное окно MainWindow где происходит(будет происходить вся) работа.

- сделать чтобы при открытии программы, сначала запрашивало диалог\запрос авторизации для ввода логина\пароля.
- или сделать кнопку в окне MainWindow где при открытии активна только она, при нажатии которой выходит окно диалога с запросом логина\пароля. и если верна авторизация то активировать все остальное в окне...

как тут удобнее, можете посоветовать в плане реализации кода?
Миниатюры
Qt приложение как mysql клиент  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2016, 17:05
Ответы с готовыми решениями:

Клиент серверное приложение ADO.net - mysql
Доброго времени суток! не знаю в какую тему написать - вопрос такой у меня приложение на c# обменивается с мускл данными в utf8 в базе...

Клиент-Серверное приложение. Как сделать, чтобы сервер сам отправлял сообщения на клиент
Добрый день всем. Проблема заключается в следующем: Есть клиент-серверное приложение, хочу реализовать своего рода защиту, чтобы при...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...

73
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
30.03.2016, 22:12  [ТС]
Студворк — интернет-сервис помощи студентам
Премного благодарен.

можно немного сократить код в qt переместив выборку сразу в sql

попутный вопрос, как вызывать допустим функцию viod mysqlcheck при старте программы?
в которой идут проверки на наличие представлений в sql и если нет, то создать.... и т.д. и т.п.

уже сделал.
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
24.06.2016, 22:35  [ТС]
Цитата Сообщение от 0x90h Посмотреть сообщение
вы не упоминаете о наличии в каталоге сборки плагина /plugins/sqldrivers/qsqlmysql.dll
Доброго вечера.

опять теже грабли, только сегодня смог продолжить работу дальше.

в общем проблема возникает вот тут:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // в этой строке укажете "QMYSQL", я для проверки использовал "слонов",
    // т.к. MySQL не пользуюсь и на машине её просто нет
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setUserName("root");
    db.setPassword("378239241");
    db.setDatabaseName("qa_BP");
    db.setHostName("192.168.10.170");
    db.setPort(3306);
 
    // если соединение установлено
    if (db.open())
    {
        QMessageBox msg(this);
        msg.setWindowTitle("Соединение установлено");
        msg.setIcon(QMessageBox::Information);
        msg.setText("Соединение установлено");
        msg.setStandardButtons(QMessageBox::Ok);
        msg.exec();
 
    }
    else
    {
        // иначе - "радуем" юзверя
        msgmess = "Не могу подключиться к БД";
        winmsg();
        exit(252);
    }
 
    Dialog_Connect2Db dialog(this);
все папки на месте, все файлы на месте...
в release\plugins\sqldrivers лежат все q***sql.dll файлы... в корне release в прогой лежит libmysql.dll
доступ к бд есть, скопировал папку sql клиента и попробовал подключтиться вручную - все ок.
а программа не подключается.
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
26.06.2016, 15:32  [ТС]
в общем программа только и запускается с того компа, на котором скомпилирована...
с тех машин откуда не подключалось, вручную из под mysql клиента все коннектится, доступ имеется, проблема не в портах/доступе/файерволе...

уже скинул в каталог с программой все *.dll из папок mibgw и qt/bin толку ноль.
имеет значение разрядность системы? все машины, даже где скомпилировано - все 64х разрядное, но q*mysql.dll и q*mysql.a, которые используются, собраны на 32х разрядной системе на другой машине.

Добавлено через 23 минуты
upd.
на той машине где запускается, закрыл доступ к серверу.
сообщение о недоступности показывается через 30-60 секунд.
а на тех машинах где не запускается - сразу,при запуске приложения.

Добавлено через 8 минут
upd. 2

методом научного тыка нашел что это из-за libmysql.dll

upd. 3

что то сейчас подумал...(и такое бывает)
можете подсказать как задаются права на базу?
user/pass или user/host
и как посмотреть из консоли?
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
28.06.2016, 22:47  [ТС]
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

и так....
нашел в чем проблема, можете помочь, как ее решить.
имеем дело:
1. компьютер win 7 x64 - распакованная сборка qt + mingw + qtcreator, которые были установлены на winxp x32
qt установлена в d:/path/qt/Qt
mingw установлен в d:/path/qt/MinGW
QtCreator установлен в d:/path/qt/QtCr
на win 7 все перенесено в точно такие же директории.
2. libmysql.dll взятая и от рабочего сервера mysql x64 и от х32 пробного "домашнего"
3. проект.

все компилируется, работает, связь есть, обработка идет, если запускать ее из qtcreator'а
если ее запускать из проводника, то она запускается только на компьютере, где установлен/распакован qt, ради интереса распаковал qt еще на 2е машины, и ура, программа заработала.

начал по очереди переименовывать все подпапки(поддиректории) в d:/path/qt/* и методом тыка нашел что программа требует папки plugins\sqldrivers...
скопировал эту папку целиком, а не только sqldrivers в каталог с программой, не переименовывая папку sqldrivers в d:/path/qt/*. и программа ругается, что не может подключится, переименовываю sqldrivers в d:/path/qt/* обратно - все работает.

почему программа не ищет эту папку рядом с собой?
папка просто скопирована, а не создана, то есть ошибиться в названии я точно не мог.

Добавлено через 10 минут
проблема решилась тем, что нужно ложить папку sqldrivers не в plugins\ а рядом с программой.
просто днем не мог полноценно заняться, работа по специальности таки немного другая
1
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
05.07.2016, 15:01  [ТС]
Цитата Сообщение от Серый_Ветер Посмотреть сообщение
Сообщение было отмечено автором темы, экспертом или модератором как ответ
а за что? что я такого сделал то?
ничего плохого не написал вроде...

на повестке дня пара вопросов.

1. имеем функцию отображение sql данных(рабочая даже!!)
привязываем ее к запуску программы и к одной кнопке...
запускаем программу.
нажимаем кнопку 10-20 раз.
программа начинает кушать от 150 мегабайт оперативной памяти...
при нажатии кнопки около 90 раз(сам не считал,матроса посадил для нажимания кнопки в количестве 90-100 раз)
программа жрет уже 900 метров и файл подкачки увеличивается на 700 метров....
чем можно отследить, что там такое прожорливое?

2. существуют ли примеры такого типа:
один или два до n+1 столбцов в модели QSqlTableModel, далее отображающихся в tableView, заменяются combobox'ами с данными типа name0, name1..., но в самих полях в базе только значения от 0, 1,..., n+1
при выборе в combobox'е в таблицу пишется соответствующее значение...

3. можно ли выборочно разрешить редактировать столбцы, а то нашел только либо все,либо ничего?

Добавлено через 2 минуты
Цитата Сообщение от Серый_Ветер Посмотреть сообщение
а за что? что я такого сделал то?
ничего плохого не написал вроде...
кхе...
нуда... сначала учат вначале [цензура], потом спрашивать.... так и тут.... не прочел что написали, и сразу "почему? зачем?"
виноват...
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
07.07.2016, 15:35
Где-то утечка памяти видимо. Скорее всего объекты создающиеся при нажатии на кнопку никуда не деваются, зато создаются новые.
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
10.07.2016, 16:05  [ТС]
Цитата Сообщение от Amok Посмотреть сообщение
Скорее всего объекты создающиеся при нажатии на кнопку никуда не деваются, зато создаются новые.
эм...
вот весь код... который по кнопке вызывается:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
void MainWindow::tabelupdate()
{
    QString fillq;
    // Создаем модель
    model = new QSqlTableModel(this);
    // Выбираем таблицу-источник данных для модели:
    // название таблицы, разумеется, укажете своё
    if(uIdBp == "70"){
        model->setTable("sel_70");
        fillq = "1=1 AND date_z >= (CURDATE()-1) AND date_z <= CURDATE() ORDER BY name_op ASC, date_z ASC, time_z ASC";
    } else if(uIdBp == "0"){
        model->setTable("sel_dp");
        fillq = "1=1 ORDER BY name_op ASC, date_z ASC, time_z ASC";
    } else {
        model->setTable("_zreal");
        fillq = "id_vid_bp='"+uIdBp+"' AND  date_z >= (CURDATE()-1) AND date_z <= CURDATE() ORDER BY date_z ASC, time_z ASC";
    }
    model->setFilter(fillq);
    //сотрирует по колонке 1.2.3.4.5.6
    //сортирует по возрастанию
    //model->setSort(2, Qt::AscendingOrder);
    //сортирует по убыванию
    //model->setSort(2, Qt::DescendingOrder);
    //model->setSort(3, Qt::DescendingOrder);
    // Выборка информации из БД в модель,
    // эквивалентно SQL-выражению "SELECT * FROM test_table"
    // для данного случая:
    model->select();
    model->setHeaderData(12, Qt::Horizontal, "К1");
    model->setHeaderData(13, Qt::Horizontal, "К2");
    model->setHeaderData(14, Qt::Horizontal, "К3");
    model->setHeaderData(15, Qt::Horizontal, "К4");
    model->setHeaderData(16, Qt::Horizontal, "К5");
    model->setHeaderData(17, Qt::Horizontal, "К6");
    model->setHeaderData(18, Qt::Horizontal, "К7");
    model->setHeaderData(19, Qt::Horizontal, "К8");
    model->setHeaderData(20, Qt::Horizontal, "К9");
    model->setHeaderData(21, Qt::Horizontal, "К10");
    model->setHeaderData(22, Qt::Horizontal, "К11");
    model->setHeaderData(23, Qt::Horizontal, "К12");
    this->ui->tableView->setModel(model);
    this->ui->tableView->hideColumn(0);
    this->ui->tableView->hideColumn(1);
    if(uIdBp == "70"){
        this->ui->tableView->hideColumn(6);
        this->ui->tableView->hideColumn(7);
        this->ui->tableView->hideColumn(8);
        this->ui->tableView->hideColumn(11);
    } else if(uIdBp == "0"){
    }
    else {
        this->ui->tableView->hideColumn(10);
        this->ui->tableView->hideColumn(12);
        this->ui->tableView->hideColumn(13);
        this->ui->tableView->hideColumn(14);
        this->ui->tableView->hideColumn(15);
        this->ui->tableView->hideColumn(16);
        this->ui->tableView->hideColumn(17);
        this->ui->tableView->hideColumn(18);
        this->ui->tableView->hideColumn(19);
        this->ui->tableView->hideColumn(20);
        this->ui->tableView->hideColumn(21);
        this->ui->tableView->hideColumn(22);
        this->ui->tableView->hideColumn(23);
    }
    // последнюю секцию горизонтального хедера делаем растягивающейся
    //this->ui->tableView->horizontalHeader()->setStretchLastSection(true);
}
ну и сама кнопка:
C++ (Qt)
1
2
3
4
void MainWindow::on_pushButton_clicked()
{
       tabelupdate();
}
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
10.07.2016, 16:13
C++ (Qt)
1
model = new QSqlTableModel(this);
Вызовете функцию 100 раз - 100 раз будет выполнена операция new QSqlTableModel(this). Память выделяется под объект, но не освобождается перед следующим вызовом этой функции. Если вызов был осуществлен много раз, то получите "много"-1 бесхозных объектов, отъедающих память. Указатель model будет указывать на последний созданный объект.
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
10.07.2016, 23:22  [ТС]
немного почитал...
то есть достаточно одной строки в функцию ниже и все будет в порядке:

C++ (Qt)
1
2
3
4
5
MainWindow::~MainWindow()
{
    delete model;
    delete ui;
}
и все будет нормально? о_О
проверить не могу сейчас, максимум через неделю....
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
10.07.2016, 23:39
Следует разделить создание модели и код ее обновления, а model будет удалена родителем автоматически, даже если вы не упомянете ее в деструкторе
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
14.07.2016, 23:04  [ТС]
p.s. виноват за долгий ответ, не мог ранее...

то есть я могу сделать так:
создание:
C++ (Qt)
1
model = new QSqlTableModel(this);
запихнуть в
C++ (Qt)
1
2
3
4
5
6
7
8
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
//куда нибудь сюда...
model = new QSqlTableModel(this);
tabelupdate();
}
а функцию tabelupdate(); просто использовать без этой строки?
в принципе в субботу можно будет опробовать.... не ранее

Добавлено через 4 минуты
а запросы в БД.
там тоже объекты создаются и хранятся все время в памяти?
типа такого:
C++ (Qt)
1
2
3
4
    Seld = new QSqlQueryModel;
    QSqlQuery select = QString("запрос");
    Seld->setQuery(select);
    ui->comboBox->setModel(Seld);
при этом запросы то разные....
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
16.07.2016, 05:00  [ТС]
попробовал, работает
правда только с моделью.
на запросы - нифига. приложение вылетает в момент запуска.

такой вопрос...
есть немного/немало label'ов такого имени name[1-17]_ms, есть так же переменная, которая принимает такие же значения(и применяется в паре других мест для получения данных).
как в цикле им(label) присвоить значения?
ui->+srt_name+"_ms"->settext
не работает... как и другие варианты которые пробовал
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
11.09.2016, 19:13  [ТС]

Не по теме:

такс, опять за компьютером...
опять продолжать работы....



Цитата Сообщение от Серый_Ветер Посмотреть сообщение
ui->+srt_name+"_ms"->settext
с этим я разобрался, даже в csv сохраняет кое как, надо будет потом заняться, подрихтовать...
0
06.11.2017, 23:59  [ТС]

Не по теме:

такс, вернулся из командировки годовой :)

продолжу дальше мучения...

осталось найти сами исходники, куда засунул....

0
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru