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

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

04.01.2016, 17:05. Показов 5787. Ответов 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
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
17.01.2016, 04:39
Студворк — интернет-сервис помощи студентам
select() выберет все поля, это фактически эквивалент SELECT *, те из них, которые не нужно показывать - просто скройте их, у QTableView есть метод hideColumn
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
17.01.2016, 04:54  [ТС]
Цитата Сообщение от 0x90h Посмотреть сообщение
у QTableView есть метод hideColumn
просто есть пара запросов, где нужно вывести данные не в таблице, а labelу присвоить значения.
ранее это попроще было(касательно выборки данных)
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
17.01.2016, 05:00
Цитата Сообщение от Серый_Ветер Посмотреть сообщение
просто есть пара запросов, где нужно вывести данные не в таблице, а labelу присвоить значения.
Не вижу в этом проблемы, там где удобнее применить QSqlQuery - используйте его, где есть необходимость вывода в табличной форме - пользуйтесь QSql****Model. Одно не исключает другого, а скорее дополняет.
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
17.01.2016, 05:43  [ТС]
а, прошу прощения. не думал о таком варианте событий. Спасибо за решение проблемы.

Добавлено через 40 минут
можете показать где ошибка?
добавлены 2 переменные. name_op и name_bp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Dialog_Connect2Db : public QDialog, private Ui::Dialog_Connect2Db
{
    Q_OBJECT
 
    QSqlTableModel *model1;
    QTableView     *view1;
 
private slots:
    void connectToDB();
    void togglePasswordEcho(bool t);
 
public:
    QString    name_op() const;
    QString    name_bp() const;
    explicit Dialog_Connect2Db(QWidget *parent = 0);
};
в ходе работы им присваиваются данные:
C++ (Qt)
1
2
            name_op = QueryOnline.value(0).toString();
            name_bp = QueryOnline.value(1).toString();
то что идет присвоение - проверено кодом ниже
C++ (Qt)
1
2
3
4
5
        msg.setWindowTitle(QueryOnline.value(0).toString());
        msg.setIcon(QMessageBox::Critical);
        msg.setText(QueryOnline.value(1).toString());
        msg.setStandardButtons(QMessageBox::Close);
        msg.exec();
все отображается.

а в mainwindow
C++ (Qt)
1
2
3
4
5
6
    Dialog_Connect2Db dialog(this);
    if (dialog.exec() == QDialog::Accepted)
    {
        ui->label->setText(Dialog_Connect2Db.name_op());
        ui->label_2->setText(Dialog_Connect2Db.name_bp());
    }
ничего не приходит, вернее компилятор ругается на код:
C++ (Qt)
1
2
        ui->label->setText(Dialog_Connect2Db.name_op());
        ui->label_2->setText(Dialog_Connect2Db.name_bp());
expected primary-expression before '.' token
expected primary-expression before '.' token
хотя сделал по примеру из доков.
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
17.01.2016, 06:02
Dialog_Connect2Db - это название типа, а компилятор намекает вам, что ему нужен объект

Добавлено через 13 минут
Цитата Сообщение от Серый_Ветер Посмотреть сообщение
добавлены 2 переменные. name_op и name_bp
так переменные или методы?

объявляете вы их как методы
C++ (Qt)
1
2
3
    
QString  name_op() const;
QString  name_bp() const;
а используете:

C++ (Qt)
1
2
            name_op = QueryOnline.value(0).toString();
            name_bp = QueryOnline.value(1).toString();
?!
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
17.01.2016, 19:02  [ТС]
ну, бывает.... неверный пример использовал из рунета.

в dialog.h добавил:

C++ (Qt)
1
2
3
signals:
    void sendnameop(const QString &str);
    void sendnamebp(const QString &str);
в функции void Dialog_Connect2Db::connectToDB добавил:
C++ (Qt)
1
2
3
4
5
6
7
8
void Dialog_Connect2Db::connectToDB()
{
...
            QString nameop = QueryOnline.value(0).toString();
            QString namebp = QueryOnline.value(1).toString();
            emit sendnameop(nameop);
            emit sendnamebp(namebp);
}
а вот с connect в mainwindow.h возникли трудности... вроде по мануалу, а не работает. Правда не уверен в том что верно указал label в коннекте...
C++ (Qt)
1
    connect(ui->label, SIGNAL(sendnameop(QString),this,SLOT(connectToDB())));
или обязательно надо создавать новый слот в dialog.h для передачи, а не старым воспользоваться?

Не по теме:

(который вроде подходит по функциям)

0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
17.01.2016, 19:04
не совсем понял, какого именно результата вы пытаетесь добиться
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
17.01.2016, 19:14  [ТС]
в dialog.cpp делаю запрос с изъятием из результата запроса двух(на данный момент) переменных, которые надо показать в label mainwindow.cpp. они не табличные, а будут использоваться в коде в виде данных(если получится с двумя то справиться)
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
17.01.2016, 19:37
Если данные вы получаете в диалоге, то можно сохранить их в приватных данных-членах класса диалога, а для доступа к ним извне можно определить в публичной части класса методы-геттеры, возвращающие эти данные. Диалог подключения вы все равно вызываете из MainWindow, следовательно, у вас есть объект этого класса, через который можно получить искомое. Этот вариант позволяет обойтись без сигналов/слотов.

C++ (Qt)
1
connect(ui->label, SIGNAL(sendnameop(QString),this,SLOT(connectToDB())));
То что вы написали - это попытка соединения сигнала sendnameop(QString), высылаемого объектом ui->label, со слотом connectToDB() объекта класса MainWindow. Вы твердо уверены, что ваш label способен эмитировать такой сигнал?!

Возможно, вы подразумевали что-то вроде:
C++ (Qt)
1
connect("объект_диалога", SIGNAL(sendnameop(QString), ui->label, SLOT(setText(QString)))
где "объект_диалога" следует заменить на имя вашего объекта
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
17.01.2016, 20:52  [ТС]
эээ....

Не по теме:

\me ушол в угол курить мануалы...



что есть объект? не в физическом и метафизическом смыслах, а касательно qt?
я так понял что в хедере и объявляются объекты....
можно пару десятков вопросов:
Цитата Сообщение от 0x90h Посмотреть сообщение
где "объект_диалога" следует заменить на имя вашего объекта
его объявлять в dialog.h или mainwindow.h

Не по теме:

я запуталсо...



Добавлено через 24 минуты
из документации:
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
я тут недопонял...
диалоговое окно, по нажатию клавиши ок происходит выполнение некоего кода... где идет присвоение переменной "А" значения "111". тогда отправителем будет buttonbox->button(QDialogButtonBox::Ok)
но это действие происходит в dialog.cpp... а кто является отправителем в mainwindow я не понял принципа

Добавлено через 34 минуты
попробовал....
C++ (Qt)
1
    connect(Dialog_Connect2Db->button(QDialogButtonBox::Ok), SIGNAL(sendnameop(QString), ui->label, SLOT(setText(QString)));
ругань идет:
..\window\mainwindow.cpp:50: error: expected primary-expression before '->' token
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
17.01.2016, 21:16
Цитата Сообщение от Серый_Ветер Посмотреть сообщение
что есть объект? не в физическом и метафизическом смыслах, а касательно qt?
Объект - это конкретный экземпляр класса. Причем безотносительно Qt. ООП, источник, конечно, "так себе", но "для начала" - сгодится.

Цитата Сообщение от Серый_Ветер Посмотреть сообщение
я так понял что в хедере и объявляются объекты....
В хедере объявляется, фактически, пользовательский тип данных (класс). "Объявить" (описать) не эквивалентно "создать". Объект (экземпляр) этого класса еще нужно создать.

Цитата Сообщение от Серый_Ветер Посмотреть сообщение
а вот с connect в mainwindow.h (?!!!) возникли трудности...
Подключение осуществляется в файле с реализацией (cpp), не в заголовочнике.

Цитата Сообщение от Серый_Ветер Посмотреть сообщение
ругань идет:
И будет идти, пока вы не осознаете разницу между типом данных и объектом (конкретным экземпляром) такого типа, тем более что QDialogButtonBox никогда не будет отправителем такого сигнала.
1
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
26.01.2016, 00:22  [ТС]
посидел, покумекал с помощью 0x90h слоты и сигналы... все равно понял тока половину.

можете подсказать, в чем глюк...
код кнопки:
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
void MainWindow::on_pushButton_Up_clicked()
{
    if(ui->checktime->isChecked())
    {
        //забрали переменные из комбобокса и перевели в цифирь.
        QString aqsw = ui->settime->currentText();
        int qaws = aqsw.toInt();
        qaws = qaws * 60000;
        //проверяем если запущенные таймеры, если есть - останавливаем.
        if(timer->isActive())
        {
            QMessageBox msg(this);
            msg.setWindowTitle("Время");
            msg.setIcon(QMessageBox::Critical);
            msg.setText("уже запущен");
            msg.setStandardButtons(QMessageBox::Close);
            msg.exec();
            //timer->stop();
        }
        //создаем таймер
        timer = new QTimer;
        //создаем слот по срабатыванию таймера
        QObject::connect(timer,SIGNAL(timeout()), this, SLOT(tabelupdate()));
        //включам таймер с переменной из комбобокса
        timer->start(qaws);
 
 
    }
    else {
    tabelupdate();
    }
}
в общем не работает только код который проверяет наличие уже включенных таймеров и по идее отключает их, но у меня крашится программа...
а то я так тестил.... оказалось, каждое нажатие кнопки запускает еще и еще и еще один таймер... под конец у меня просто каждую секунду были сообщения о срабатывании таймера.
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
26.01.2016, 00:49
Серый_Ветер, содержимое хедера MainWindow покажите
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
26.01.2016, 01:01  [ТС]
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
    QString uIdBp;
    QSqlTableModel *model;
    QTableView     *view;
    QTimer *timer;
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
public slots:
    void setUserName(QString userName);
    void setUserBp(QString userBp);
    void setUserIdBp(QString userIdBp);
 
private slots:
    void tabelupdate();
    ....
вроде и timer обозначен и слот обозначен. или я опять не так слоты с сигналами не там или не так забил?
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
26.01.2016, 01:19
C++ (Qt)
1
2
        //создаем таймер
        timer = new QTimer(this);
эта строка должна быть в конструкторе MainWindow, в хедере также нужно #include <QTimer>

C++ (Qt)
1
QObject::connect(timer,SIGNAL(timeout()), this, SLOT(tabelupdate()));
connect можно вызвать, не используя QObject::, так как ваш класс MainWindow унаследует connect от QMainWindow, который в свою очередь является потомком QObject. Т.е. вполне достаточно написать:

C++ (Qt)
1
connect(timer,SIGNAL(timeout()), this, SLOT(tabelupdate()));
эта строка тоже должна быть в конструкторе, повторно устанавливать соединение в слоте - нет необходимости

какую логику вы пытаетесь реализовать, использовав таймеры?
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
26.01.2016, 02:43  [ТС]
#include <QTimer>
она есть, забыл просто указать заголовок.

Цитата Сообщение от 0x90h Посмотреть сообщение
какую логику вы пытаетесь реализовать, использовав таймеры?
нужно периодически(если выставлено) вызывать tabelupdate(). соответственно, если нажали на кнопку без выставления то отключить таймер, если он был включен.

Добавлено через 10 минут
странно.
а вот тут сработало:
C++ (Qt)
1
2
3
4
5
....    
else {
        timer->stop();
        tabelupdate();
    }
но это при включенном таймере только, если сразу нажать - крах программы без объяснения причин.

Добавлено через 1 час 5 минут
все работает в таком виде:
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
void MainWindow::on_pushButton_Up_clicked()
{
    if(ui->checktime->isChecked())
    {
        //забрали переменные из комбобокса и перевели в цифирь.
        QString aqsw = ui->settime->currentText();
        int qaws = aqsw.toInt();
        qaws = qaws * 1000;
        //проверяем если запущенные таймеры, если есть - останавливаем.
        if(timer)
            //qDebug() << "1111";
            killTimer(timer->timerId());
        //создаем таймер
        timer = new QTimer;
        //создаем слот по срабатыванию таймера
        connect(timer,SIGNAL(timeout()), this, SLOT(tabelupdate()));
        //включам таймер с переменной из комбобокса
        timer->start(qaws);
    }
    else {
        if(timer)
        {
            //qDebug() << "22222";
            killTimer(timer->timerId());
 
        }
        tabelupdate();
    }
}
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
26.01.2016, 20:16
updateForTimer.zip
1
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
27.01.2016, 23:20  [ТС]
подскажите, в чем глюк?
C++ (Qt)
1
2
3
QString fillq = "1=1 ORDER BY _z ASC";
model->setFilter(fillq);
model->select();
вылетает с ошибкой
ASSERT: "idx >= 0 && idx < s" in file ../../include/QtCore/../../src/corelib/tools/qvarlengtharray.h, line 110
вроде по мануалу, сделал, даже отключил сортировку
C++ (Qt)
1
view->setSortingEnabled(false);
, которое было не указано, а сейчас явно запрещено.
если другой запрос ставить - то все нормально.
0
693 / 465 / 162
Регистрация: 01.10.2015
Сообщений: 1,274
27.01.2016, 23:27
Цитата Сообщение от Серый_Ветер Посмотреть сообщение
"1=1 ORDER BY _z ASC"
А что этим выражением фильтруется? И неплохо бы поподробнее...
0
 Аватар для Серый_Ветер
21 / 21 / 12
Регистрация: 09.01.2013
Сообщений: 457
27.01.2016, 23:43  [ТС]
вопрос решен, просто затупил после сегодняшняго дня... марш броски плохо влияют на умственную деятельность.

хотя не совсем решен.
setsort() позволяет сортировать по нескольким столбцам сразу или нет?

Добавлено через 12 минут
решен вопрос, осказалось запись типа
Code
1
ORDER BY _z ASC
с записями типа
Code
1
model->setSort(2, Qt::DescendingOrder);

либо одно либо другое. одновременно - ошибка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2016, 23:43

Как подключать приложение к MySQL - свое подключение для каждой формы, или одно на всё приложение?
Вопрос: как правильно организовать подключение к базе MySQL для приложения, которое обращается к разным таблицам одной базы - при каждом...

Клиент-серверное приложение. Сервер - ПК, клиент - телефон (Android)
Здравствуйте, решил для обучения написать программу для выключения ПК с телефона, используя компонент TIdTCPServer. Подскажите, как...

Как установить клиент и сервер MySQL?
При установке mysql на VPS-сервер (Ubuntu 12.04) возникла проблема. sudo apt-get install mysql-server mysql-client Selecting...

Как написать приложение клиент-сервер?
как написать приложение типа клиент-сервер на Java, поставил Java(TM) Web Services Developer Pack 1.1, в котором есть сервер TomCat....

Как организовать клиент-серверное приложение
Делаю лабораторную: необходимо написать три приложения на с#, два сервера (ServerInput и ServerProcess) и клиент-приложение (ClientOutput)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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