Название: Qt5+MySql+LoginWindow
Отправлено: 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. код грязен, есть лишние инклуды. Но об этом потом... Заранее благодарю.
Название: Re: Qt5+MySql+LoginWindow
Отправлено: Bepec от Ноябрь 23, 2015, 08:25
1) не form->show, а form->exec. 2) вам нужно завершать диалог вызовом accept(), а в основном окне проверять результат. 3) вы можете передавать данные для соединения, можете передавать сам объект бд, а можете ничего не передавать, ибо соединение будет по умолчанию, вроде бы.
4) не вижу в коде ни 1 вызова метода connect, т.е. вы ничего не пробовали. Потому и помогать не в чем :)
Название: Re: Qt5+MySql+LoginWindow
Отправлено: kdvdmitryor1 от Ноябрь 24, 2015, 22:42
Как и было сказано. void MainWindow::on_pushButton_connect_clicked() { // if (соединение уже установлено) mysql_disconnect
DialogConnect dlgAuth(this); if (dlgAuth.exec() == QDialog::Accepted) { // if (mysql_connect...) { активируй интерфейс } } }
Название: Re: Qt5+MySql+LoginWindow
Отправлено: cyberaxe77 от Декабрь 11, 2015, 13:39
А не будут ли благородные программисты так любезны дописать нужный функционал? Не за бесплатно, естественно...
Название: Re: Qt5+MySql+LoginWindow
Отправлено: Alex Custov от Декабрь 11, 2015, 13:51
Не за бесплатно, естественно...
Шёл бы ты, а? >:(
Название: Re: Qt5+MySql+LoginWindow
Отправлено: Bepec от Декабрь 11, 2015, 16:24
Странная реакция на "дописать за небесплатно" :)
Есть раздел объявления, правда он зачах совсем изза отсутствия новой крови, но всё ещё фунциклирует. Ну или мне в лс отпишите, обсудим что да как.
Название: Re: Qt5+MySql+LoginWindow
Отправлено: cyberaxe77 от Декабрь 11, 2015, 19:53
Не за бесплатно, естественно...
Шёл бы ты, а? >:( Понимаю Ваше недовольство. Прошу прощения за нарушение правила форума. Но зачем же сразу начинать с "посыла"?
Название: Re: Qt5+MySql+LoginWindow
Отправлено: cyberaxe77 от Декабрь 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') Понятно, что не видит слота. Но я же его прописал (вроде бы). Прошу руку помощи... Заранее благодарю.
Название: Re: Qt5+MySql+LoginWindow
Отправлено: gil9red от Декабрь 27, 2015, 22:58
Ваш проект собрался и запустился. Попробуйте пересобрать его
Название: Re: Qt5+MySql+LoginWindow
Отправлено: cyberaxe77 от Декабрь 27, 2015, 23:10
Ваш проект собрался и запустился. Попробуйте пересобрать его
Он собирается и запускается. Но не работает. Я чуть выше ошибку "процитировал", которую выплёвывает Qt-Creator. :(
Название: Re: Qt5+MySql+LoginWindow
Отправлено: Bepec от Декабрь 28, 2015, 00:57
Ошибка соединение connect(this, SIGNAL(sendData(QString)), io, SLOT(recieveData(QString))); объявление функции void Dialog_io::reciveData(QString str)
Ошибка в названии функции, будьте внимательнее.
Название: Re: Qt5+MySql+LoginWindow
Отправлено: panAlexey от Январь 03, 2016, 22:12
Там же расположен tableView для отображения и редактирования БД и кнопки "добавить", "удалить", "просмотр"(просмотр БД в tableView).
Ох уж эти мне кустарные решения. Стараюсь всегда использовать пиктограммы на это дело. (http://s005.radikal.ru/i210/1601/70/5a77b2fc6a9e.png) И очень стараюсь для начала какой-нить едит-фраймверк накидать перед работой с БД. Иначе порожняковой работы будет дофига и больше.
|