oleja1ee7
@oleja1ee7

Почему запускается первым конструктор mainwindow.cpp?

Здравствуйте.
есть файл autoriz который должен запускаться первым, а при нажатии на кнопку у его формы, открывается mainwindow.
Но при запуске первым подгружается конструктор mainwindow. как это и править или можно ли события, которые в конструкторе mainwindow (подключение к бд, и загрузка настроек из QSettings) повешать в какое-либо событие, по открытию формы??

Конструктор mainwindow
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /* код на подключение БД и настроек*/
}
Конструктор autoriz
autoriz::autoriz(QDialog *parent) :
    QDialog(parent),
    ui(new Ui::autoriz)
{
    ui->setupUi(this);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

    mainW = new MainWindow(); // Инициализируем  окно для диспетчера
    // подключаем к слоту запуска окна авторизация по кнопке в окне диспетчера
    connect(mainW, &MainWindow::firstWindow, this, &autoriz::show);
}
переход с авторизации на mainwindow
mainW->show(); //показать окно регистрации
        this->close(); // Закрываем основное окно
main.cpp
#include "autoriz.h"    //авторизация
#include "ui_autoriz.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    autoriz au;
    au.show();
    return a.exec();
}
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Я бы переписал архитектуру программы.
1. Перед вами модальное окошко. Вот его и вызывайте, как модальное — au.exec().
2. Чтобы проверить, что авторизация верна, надо соединиться. Так что сделайте невизуальный объект «соединение» и протащите в exec. Ну или создайте в exec.
3. А уж там собирайте основную программу.
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 {
      // сообщи об ошибке
   }
}

Вижу побочку этого (но, может, и не надо избавляться) — на панели задач анимацией сменяется кнопка с диалогом авторизации на кнопку с главным окном.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы