Qt zamknięcie programu w pewnej sytuacji

0

Witam,
Mam następujący kod:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include <QtSql>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

signals:
    void pewiensygnal();
private:
    Ui::MainWindow *ui;
    QSqlTableModel model;
    QSqlDatabase db;
};

#endif // MAINWINDOW_H
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // aby pewien wyemitowany sygnal zakonczyl aplikacje
    connect(this, SIGNAL(pewiensygnal()), qApp, SLOT(quit()));

    // utworz katalog, w ktorym bedziemy pracowac
    QString homepath(QDir::home().path());
    QString app_path = homepath.append("/.studentsdb");
    if(!QDir(app_path).exists())
        QDir().mkdir(homepath);
    QString db_path = app_path.append("/studenci.db");

    // polacz sie z baza danych
    db = QSqlDatabase::addDatabase("QSQLITE3");
    db.setDatabaseName(db_path);

    if(!db.open()) {
        QMessageBox::critical(this, tr("Polaczenie z baza"), tr("Nie udalo sie polaczyc z baza danych, sprawdz uprawnienia dostepu."));
        // baza SQLite powinna utworzyc sie sama, wiec wyjdz z aplikacji
        emit pewiensygnal();
    } else {
    }

    // sprawdz czy baza danych zawiera tabele, jesli nie zawiera to ja utworz
}

void MainWindow::pewiensygnal()
{

}

MainWindow::~MainWindow()
{
    delete ui;
}
  1. Zastanawiam się w jaki sensowny sposób można zastąpić to exit(1), aby było bardziej Qt-owo?
  2. Z reguły w Qt używa się mechanizmu sygnał-slot. Nie ma problemu ze slotem, ponieważ obiekt aplikacji posiada domyślny slot close(). Aby go ustawić używam polecenia connect. W jaki sposób mogę wyemitować sygnał?

Na wyjściu otrzymuje takie błędy:
Multiple definition of MainWindow::pewiensygnal()

0

http://lists.trolltech.com/qt-interest/2007-04/msg00092.html

Just see "examples" folder and read Qt Assistant

qApp->exit(0);

or

QApplication app(argc, argv);
     app.setQuitOnLastWindowClosed(true);
0

W tej chwili po usunięciu sygnału z MainWindow.cpp kompiluje się, ale nie wychodzi. Samo wysyłanie działa, sprawdziłem na aboutQt().

Problem: aplikacja nie zamyka sie.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // aby pewien wyemitowany sygnal zakonczyl aplikacje
    connect(this, SIGNAL(pewiensygnal()), qApp, SLOT(closeAllWindows()));

    // utworz katalog, w ktorym bedziemy pracowac
    QString homepath(QDir::home().path());
    QString app_path = homepath.append("/.studentsdb");
    if(!QDir(app_path).exists()) QDir().mkdir(homepath);
    QString db_path = app_path.append("/studenci.db");

    // polacz sie z baza danych
    db = QSqlDatabase::addDatabase("QSQLITE3");
    db.setDatabaseName(db_path);

    if(!db.open()) {
        QMessageBox::critical(this, tr("Polaczenie z baza"), tr("Nie udalo sie polaczyc z baza danych, sprawdz uprawnienia dostepu."));
        // baza SQLite powinna utworzyc sie sama, wiec wyjdz z aplikacji
        emit pewiensygnal();
        //qApp->exit(1);
    } else {
    }

    // sprawdz czy baza danych zawiera tabele, jesli nie zawiera to ja utworz
}

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

Odkomentowanie qApp->exit(1) nie pomoga. Co to może być?

0

A MessageBox się pokazuje?

0

Tak pokazuje się.

Zdecydowałem się dołączyć #include<cstdlib> i użyć exit z tej biblioteki.

Próbowałem:
http://developer.qt.nokia.com/doc/qt-4.8/qcoreapplication.html#exit

Niestety, zadziałą dopiero po app.exec(). W konstuktorze użycie biblioteki C to chyba nie zbrodnia, działa jak należy.

0
  • Wywal public slots: skoro nie definiujesz publicznych slotów,
  • Wyczyść projekt,
  • Uruchom qmake,
  • Zbuduj projekt.
0

nie ma bata, żeby std::exit() nie zamknęło programu. zapewne uruchamia ci się inne exit() z jakiejś klasy albo innego namespace'a.

0

std::exit() działa, problem już rozwiązany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1