Russian Qt Forum
Апрель 24, 2024, 13:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt5+MySql+LoginWindow  (Прочитано 7198 раз)
cyberaxe77
Гость
« : Ноябрь 23, 2015, 07:17 »

Доброго времени суток, уважаемые форумчане.
Балуюсь Qt и, естественно, возникли некоторые вопросы.
Есть некая MySql-база. Пытаюсь писать морду для работы с ней. На mainwindow одна кнопка, которая "вызывает" окно авторизации с БД. Там же расположен tableView для отображения и редактирования БД и кнопки "добавить", "удалить", "просмотр"(просмотр БД в tableView). Хотелось бы, при удачной авторизации, передать управление с окна авторизации на mainwindow для дальнейших манипуляций с БД.
Как я себе это вижу:
-при валидной авторизации, окно авторизации как-то должно "просигналить" основному окну об этом событии,передать управление БД основному окну и закрыться. Вся остальная работа в основном окне. Как это реализовать? Понимаю, что собака порылась в сигналах и слотах, но где и как она порылась? Готовый код не клянчу, но и к стандартным мануалам просьба не отсылать.
Ниже, собственно, мой говнокод:
main.cpp
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogconnect.h"
#include <QSqlTableModel>
#include <QSqlError>
#include <QMessageBox>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    mModel = new QSqlTableModel(this);
    mModel->setTable("test");
    mModel->select();
    ui->tableView->setModel(mModel);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_connect_clicked()
{
    DialogConnect *form = new DialogConnect();
    form->setAttribute(Qt::WA_DeleteOnClose, true);
    form->show();
}
 
void MainWindow::on_pushButton_add_clicked()
{
    mModel->insertRow(mModel->rowCount());
}
 
void MainWindow::on_pushButton_del_clicked()
{
    mModel->removeRow(ui->tableView->currentIndex().row());
}
 
void MainWindow::on_pushButton_view_clicked()
{
    mModel->select();
}

dialogconnect.cpp
Код:
#include "dialogconnect.h"
#include "ui_dialogconnect.h"
#include <QSqlTableModel>
#include <QSqlError>
#include <QMessageBox>
 
DialogConnect::DialogConnect(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogConnect)
{
    ui->setupUi(this);
 
}
 
DialogConnect::~DialogConnect()
{
    delete ui;
}
 
void DialogConnect::on_pushButton_2_clicked()
{
    this->close();
}
 
void DialogConnect::on_pushButton_login_clicked()
{
    QString hostname, username, password;
 
    hostname = ui->lineEdit_adress->text();
    username = ui->lineEdit_username->text();
    password = ui->lineEdit_password->text();
 
    mDatabase = QSqlDatabase::addDatabase("QMYSQL");
    mDatabase.setHostName(hostname);
    mDatabase.setDatabaseName("test");
    mDatabase.setPort(3306);
    mDatabase.setUserName(username);
    mDatabase.setPassword(password);
    if(!mDatabase.open())
    {
        QMessageBox::critical (this, "Error", mDatabase.lastError ().text ());
        //return;
    }
    else
        QMessageBox::information (this, "Error", mDatabase.lastError ().text ());
}

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QSqlTableModel>
#include <QSqlDatabase>
#include "dialogconnect.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void on_pushButton_connect_clicked();
 
    void on_pushButton_add_clicked();
 
    void on_pushButton_del_clicked();
 
    void on_pushButton_view_clicked();
 
private:
    Ui::MainWindow *ui;
    QSqlTableModel *mModel;
    QSqlDatabase mDatabase;
};
 
#endif // MAINWINDOW_H

dialogconnect.h
Код:
#ifndef DIALOGCONNECT_H
#define DIALOGCONNECT_H
 
#include <QDialog>
#include <QMainWindow>
#include <QSqlDatabase>
 
namespace Ui {
class DialogConnect;
}
 
class DialogConnect : public QDialog
{
    Q_OBJECT
 
public:
    explicit DialogConnect(QWidget *parent = 0);
    ~DialogConnect();
 
private slots:
    void on_pushButton_2_clicked();
 
    void on_pushButton_login_clicked();
 
private:
    Ui::DialogConnect *ui;
    QSqlDatabase mDatabase;
};
 
#endif // DIALOGCONNECT_H

P.S. код грязен, есть лишние инклуды. Но об этом потом...
Заранее благодарю.
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 23, 2015, 08:25 »

1) не form->show, а form->exec.
2) вам нужно завершать диалог вызовом accept(), а в основном окне проверять результат.
3) вы можете передавать данные для соединения, можете передавать сам объект бд, а можете ничего не передавать, ибо соединение будет по умолчанию, вроде бы.

4) не вижу в коде ни 1 вызова метода connect, т.е. вы ничего не пробовали. Потому и помогать не в чем Улыбающийся

Записан
kdvdmitryor1
Гость
« Ответ #2 : Ноябрь 24, 2015, 22:42 »

Как и было сказано.
Код:
void MainWindow::on_pushButton_connect_clicked()
{
    // if (соединение уже установлено) mysql_disconnect

    DialogConnect dlgAuth(this);
    if (dlgAuth.exec() == QDialog::Accepted)
    {
       // if (mysql_connect...) { активируй интерфейс }
    }
}
Записан
cyberaxe77
Гость
« Ответ #3 : Декабрь 11, 2015, 13:39 »

А не будут ли благородные программисты так любезны дописать нужный функционал? Не за бесплатно, естественно...
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Декабрь 11, 2015, 13:51 »

Не за бесплатно, естественно...

Шёл бы ты, а? Злой
Записан
Bepec
Гость
« Ответ #5 : Декабрь 11, 2015, 16:24 »

Странная реакция на "дописать за небесплатно" Улыбающийся

Есть раздел объявления, правда он зачах совсем изза отсутствия новой крови, но всё ещё фунциклирует. Ну или мне в лс отпишите, обсудим что да как.
Записан
cyberaxe77
Гость
« Ответ #6 : Декабрь 11, 2015, 19:53 »

Не за бесплатно, естественно...

Шёл бы ты, а? Злой
Понимаю Ваше недовольство. Прошу прощения за нарушение правила форума. Но зачем же сразу начинать с "посыла"?
Записан
cyberaxe77
Гость
« Ответ #7 : Декабрь 27, 2015, 22:40 »

Теперь следующий вопрос. Опять сигналы и слоты.
В mainwindow есть пременная QString search_reg_numb для поиска в БД по госномеру. Есть QDialog в который нужно передать эту переменную, чтобы в QSqlQueryModel отобразить данные о найденном транспортном средстве. Совсем запутался. Помогите пожалуйста, а...
main.cpp
Код:
#include "mainwindow.h"
#include <QApplication>




int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

dialog_io.h
Код:
#ifndef DIALOG_IO_H
#define DIALOG_IO_H

#include <QDialog>
#include <QSqlTableModel>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlError>



namespace Ui {
class Dialog_io;
}

class Dialog_io : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog_io(QWidget *parent = 0);
    ~Dialog_io();

public slots:
    void reciveData(QString str);

private slots:
    void on_pushButton_close_clicked();


private:
    Ui::Dialog_io *ui;
    QSqlQueryModel *model;
};

#endif // DIALOG_IO_H

dialog_io.cpp
Код:
#include "dialog_io.h"
#include "ui_dialog_io.h"
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>

Dialog_io::Dialog_io(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog_io)
{
    ui->setupUi(this);
}
QString str;
void Dialog_io::reciveData(QString str)
    {
        QSqlQueryModel *model = new QSqlQueryModel;
        //  QString str;
        model -> setQuery("select * from Cars_Main where Reg_Numb='"+str+"'");
        model->setHeaderData(0, Qt::Horizontal, tr("ID"));
        model->setHeaderData(1, Qt::Horizontal, tr("Марка ТС"));
        model->setHeaderData(2, Qt::Horizontal, tr("Рег. Номер"));
        model->setHeaderData(3, Qt::Horizontal, tr("Организация"));
        model->setHeaderData(4, Qt::Horizontal, tr("№ транспортного пропуска"));
        model->setHeaderData(5, Qt::Horizontal, tr("Время"));

        ui->tableView_io->setColumnHidden(0, true);
        ui->tableView_io->setColumnHidden(5, true);
        ui->tableView_io->setAlternatingRowColors(true);
        // Разрешаем выделение строк
        ui->tableView_io->setSelectionBehavior(QAbstractItemView::SelectRows);
        ui->tableView_io->resizeColumnsToContents();
    }



Dialog_io::~Dialog_io()
{
    delete ui;
}


void Dialog_io::on_pushButton_close_clicked()
{
    this -> close();
}

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
#include "dialogconnect.h"
#include "dialog_io.h"




namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

signals:
    void sendData(QString str);


private:
    Ui::MainWindow *ui;
    QSqlTableModel* mModel;
    databaseData data_;
    Dialog_io *io;

private slots:
    void on_pushButton_connect_clicked();
    void on_pushButton_add_clicked();
    void on_pushButton_del_clicked();
    void on_pushButton_view_clicked();
    void on_pushButton_search_clicked();
    void showTime();
};

#endif // MAINWINDOW_H

mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>
#include <QTimer>
#include <QDateTime>
#include "dialog_io.h"



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
    timer -> start();

    //вставляем картинку
    //QPixmap pix("/home/axe/Qt5/Projects/testSql/pix/Linus.jpg");
    //ui -> label_pic -> setPixmap(pix);
}
//запиливаем электронные часики
void MainWindow::showTime()
{
    QTime time = QTime::currentTime();
    QString time_text = time.toString("hh:mm");

    if ((time.second() % 2) == 0)
    {
        time_text[2] = ' ';
        //time_text[8] = ' ';
    }
    ui -> Digital_clock -> setText(time_text);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_connect_clicked()
{
    // создаём диалог
    DialogConnect *dialog = new DialogConnect();
    // вызываем его и запускаем цикл событий (exec). Пока диалог не будет завершён, выполнение ф-ции будет приостановлено. При завершении диалог возвращает результат в виде int.
    int result = dialog->exec();
    // если результат успешен, то мы получаем данные соединения от диалога, устанавливаем имя таблицы в модель и выбираем результат.
    if (result == QDialog::Accepted)
    {
        data_ = dialog->returnData();
        mModel = new QSqlTableModel(this);
        ui->tableView->setModel(mModel);
        mModel->setTable("Cars_Main");
        mModel->setEditStrategy(QSqlTableModel::OnFieldChange);
        mModel->select();
        mModel->setHeaderData(0, Qt::Horizontal, tr("ID"));
        mModel->setHeaderData(1, Qt::Horizontal, tr("Марка ТС"));
        mModel->setHeaderData(2, Qt::Horizontal, tr("Рег. Номер"));
        mModel->setHeaderData(3, Qt::Horizontal, tr("Организация"));
        mModel->setHeaderData(4, Qt::Horizontal, tr("№ транспортного пропуска"));
        mModel->setHeaderData(5, Qt::Horizontal, tr("Время"));

        //прячем столбцы ID и Time
        ui->tableView->setColumnHidden(0, true);
        ui->tableView->setColumnHidden(5, true);
        ui->tableView->setAlternatingRowColors(true);
        // Разрешаем выделение строк
        ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
        ui->tableView->resizeColumnsToContents();
    }
    // если результат неуспешен, мы ничего не делаем


}

void MainWindow::on_pushButton_add_clicked()
{
    qDebug() << mModel->insertRow(mModel->rowCount());
}

void MainWindow::on_pushButton_del_clicked()
{
    mModel->removeRow(ui->tableView->currentIndex().row());
    // после удаления в таблице остаётся пустая строка, она будет убрана при следующем select
    //костыль - прячем пустую строку вызовом mModel -> select()
    mModel->select();

}

void MainWindow::on_pushButton_view_clicked()
{
    mModel->select();
}


void MainWindow::on_pushButton_search_clicked()
{
    QString search_reg_numb;
    search_reg_numb = ui -> lineEdit_search -> text();
    emit sendData(ui -> lineEdit_search -> text());

    QSqlQuery qry;

    if(qry.exec("select * from Cars_Main where Reg_Numb='"+search_reg_numb+"'"))
    {
        int count = 0;
        while(qry.next())
        {
            count ++;
        }
        if(count == 1)
        {
            //QMessageBox::information (this, "Доступ разрешён", search_reg_numb, QMessageBox::Ok);
            io = new Dialog_io();
            io -> exec();
            //void on_pushButton_search_clicked();
            //{
                //emit sendData(ui -> lineEdit_search -> text());
            //}
            connect(ui-> pushButton_search, SIGNAL(clicked()), this, SLOT(on_pushButton_search_clicked()));
            connect(this, SIGNAL(sendData(QString)), io, SLOT(recieveData(QString)));

        }

        else
            QMessageBox::critical (this, "Доступ запрещён!", search_reg_numb, QMessageBox::Ok);
    }
}

Собственно ошибка:
Цитировать
QObject::connect: No such slot Dialog_io::recieveData(QString) in ../testSql/mainwindow.cpp:124
QObject::connect:  (sender name:   'MainWindow')
QObject::connect:  (receiver name: 'Dialog_io')

Понятно, что не видит слота. Но я же его прописал (вроде бы).
Прошу руку помощи...
Заранее благодарю.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Декабрь 27, 2015, 22:58 »

Ваш проект собрался и запустился. Попробуйте пересобрать его
Записан

cyberaxe77
Гость
« Ответ #9 : Декабрь 27, 2015, 23:10 »

Ваш проект собрался и запустился. Попробуйте пересобрать его
Он собирается и запускается. Но не работает. Я чуть выше ошибку "процитировал", которую выплёвывает Qt-Creator.  Грустный
Записан
Bepec
Гость
« Ответ #10 : Декабрь 28, 2015, 00:57 »

Ошибка
соединение
connect(this, SIGNAL(sendData(QString)), io, SLOT(recieveData(QString)));
объявление функции
void Dialog_io::reciveData(QString str)

Ошибка в названии функции, будьте внимательнее.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #11 : Январь 03, 2016, 22:12 »

Там же расположен tableView для отображения и редактирования БД и кнопки "добавить", "удалить", "просмотр"(просмотр БД в tableView).
Ох уж эти мне кустарные решения.
Стараюсь всегда использовать пиктограммы на это дело.

И очень стараюсь для начала какой-нить едит-фраймверк накидать перед работой с БД.
Иначе порожняковой работы будет дофига и больше.
« Последнее редактирование: Январь 03, 2016, 22:16 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.