Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Главная форма и диалог 
:(
    Опции темы
aspirin2003
Дата 28.9.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Диалоговое окно вызывается из конструктора main window
Код

AuthForm authDlg(this);
if (authDlg.exec() != QDialog::Accepted)
  this->close();

Как закрыть main window (ну или другими словами завершить приложение), 
когда в окне диалога нажали "Отмена", или закрыли окно крестиком?
В приведенном выше коде close() не срабатывает.
PM MAIL   Вверх
Acer
Дата 28.9.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: 15
Всего: 8



Вот этот код
Код

AuthForm authDlg(this);
if (authDlg.exec() != QDialog::Accepted)
  this->close();

находится в конструкторе MainWindow?
Я обычно в конструктор MainWindow передаю указатель на QCoreApplication, то есть
Код

QApplication app( argc, argv );
MainWindow mw( app.instance() );

И потом можно сделать свойство класса MainWindow:
Код

QCoreApplication *main_app;

и
Код

AuthForm authDlg(this);
if (authDlg.exec() != QDialog::Accepted){
  this->close();
  this->main_app->quit();
}


Это сообщение отредактировал(а) Acer - 28.9.2008, 15:15
PM MAIL   Вверх
aspirin2003
Дата 28.9.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Почему то не помогает. Acer, а у тебя код, что ты привел работает?
 У меня как открывалось главное окно, так и открывается по прежнему.
PM MAIL   Вверх
Acer
Дата 28.9.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: 15
Всего: 8



Да, код не работает... 
Ну, я вот как придумал... Может кто придумает лучше smile
[main.cxx]
Код

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char **argv){
    QApplication app( argc, argv );
    MainWindow mw;
    if ( mw.getFlg() ){
        return 0;
    }
    mw.display();
    return app.exec();
}


[MainWindow.h]
Код

#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_

#include <QCoreApplication>
#include <QMainWindow>
#include "Dialog.h"

class MainWindow: private QMainWindow {

    Q_OBJECT

public:
    MainWindow( void );
    virtual ~MainWindow( void );

public:
    void display( void );
    bool getFlg( void );

private:
    void setWinProp( void );

private:
    bool flg;

};

#endif /* MAINWINDOW_H_ */


[MainWindow.cxx]
Код

#include "MainWindow.h"

/*
 *  Constructor
 */
MainWindow::MainWindow(): QMainWindow(){
    this->flg = false;
    if ( Dialog::ask() == Dialog::Cancel ){
        this->flg = true;
    }
}

/*
 * Destructor
 */
MainWindow::~MainWindow(){

}

/*
 * Public members
 */
void MainWindow::display(){
    this->setVisible( true );
}

bool MainWindow::getFlg(){
    return this->flg;
}
/*
 * Private members
 */
void MainWindow::setWinProp(){
    this->setFixedSize( 100, 100 );
}



[Dialog.h]
Код

#ifndef DIALOG_H_
#define DIALOG_H_

#include <QMessageBox>

class Dialog: public QMessageBox {

public:
    Dialog( void );
    virtual ~Dialog( void );

public:
    static int ask( void );

};

#endif /* DIALOG_H_ */


[Dialog.cxx]
Код

#include "Dialog.h"

/*
 * Constructor
 */
Dialog::Dialog(){

}

/*
 * Destructor
 */
Dialog::~Dialog(){

}

/*
 * Public members
 */
int Dialog::ask(){
    return question( 0, "Question", "Run this program?", QMessageBox::Ok | QMessageBox::Cancel );
}


Это сообщение отредактировал(а) Acer - 28.9.2008, 18:26
PM MAIL   Вверх
aspirin2003
Дата 28.9.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Да, решение с флагом выглядит не очень. С таким же успехом кстати можно диалог вызывать из main до вызова главного окна. 
Тем не менее спасибо за старания  smile  Может еще кто-нибудь предложит как это можно сделать иначе.
PM MAIL   Вверх
Acer
Дата 28.9.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: 15
Всего: 8



Есть еще один вариант smile
Конструктор главного окна:
Код

MainWindow::MainWindow(QCoreApplication *app): QMainWindow(){
    this->main_app = app;
    if ( Dialog::ask() == Dialog::Cancel ){
        this->~MainWindow();
    }
}

PM MAIL   Вверх
Elfebet
Дата 29.9.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



правильнее было бы вызвать
Код

QApplication::closeAllWindows();




--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
aspirin2003
Дата 29.9.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(Acer @ 28.9.2008,  22:37)
Есть еще один вариант smile
Конструктор главного окна:
Код

MainWindow::MainWindow(QCoreApplication *app): QMainWindow(){
    this->main_app = app;
    if ( Dialog::ask() == Dialog::Cancel ){
        this->~MainWindow();
    }
}

Этот вариант вообще вызывает Debug Assertion Failure  smile

Добавлено через 59 секунд
Цитата(Elfebet @ 29.9.2008,  09:24)
правильнее было бы вызвать
Код

QApplication::closeAllWindows();

Не работает. Главное окно все равно открывается.
PM MAIL   Вверх
Elfebet
Дата 29.9.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Хм... непонятна мне твоя проблема, если ты хочеш закрыть главное окно - вызови главному окну close(),  если выйти из программы то тебе нужно закрыть все окна. Если все равно чего-то неработает покажи свой код как ты делаеш (включая главное окно, main, и диалог), мне кажется у тебя ошибка в другом...

Это сообщение отредактировал(а) Elfebet - 29.9.2008, 11:48


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
aspirin2003
Дата 29.9.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(Elfebet @ 29.9.2008,  11:47)
Хм... непонятна мне твоя проблема, если ты хочеш закрыть главное окно - вызови главному окну close(),  если выйти из программы то тебе нужно закрыть все окна. Если все равно чего-то неработает покажи свой код как ты делаеш (включая главное окно, main, и диалог), мне кажется у тебя ошибка в другом...

По моему проблема описана довольно четко. По крайней мере Acer все понял.
Если из конструктора главного окна вызвать close(), то оно НЕ закрывается, так же как и в случае с QApplication::closeAllWindows().
Привожу код:
main
Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Q_INIT_RESOURCE(newcalc);

    if (!QSslSocket::supportsSsl())
    {
        QMessageBox::warning(0, "Warning",
                 "This system does not support OpenSSL.");
        }

    ClientMainWindow w;
    w.show();
    return a.exec();
}

ClientMainWindow.cpp
Код

ClientMainWindow::ClientMainWindow(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
       // ...какой-то код
    createActions();
    createMenus();
    createToolBars();
    createStatusBar();
    readSettings();
    setWindowTitle(tr("MFS Client"));
    setWindowIcon(QIcon(":/images/save.png"));

    // Помещаем окно по центру экрана
    QDesktopWidget dw;
    QRect myrect = dw.screenGeometry();
    int my_y = (myrect.height())/2 - height()/2;
    int my_x = (myrect.width())/2 - width()/2;
    QPoint myTopLeft(my_x, my_y);
    move(myTopLeft);

    
       createConnectionToProxy();

       // Показываем диалог аутентификации
    AuthForm authDlg(this);
    
    if (authDlg.exec() != QDialog::Accepted)
       {
           // Здесь необходимо выйти из программы
       }
       // ... какой-то код
 
диалог
Код

#include <QtGui/QDesktopWidget>
#include "authform.h"

AuthForm::AuthForm(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
    // Помещаем окно по центру экрана
    QDesktopWidget dw;
    QRect myrect = dw.screenGeometry();
    int my_y = (myrect.height())/2 - height()/2;
    int my_x = (myrect.width())/2 - width()/2;
    QPoint myTopLeft(my_x, my_y);
    move(myTopLeft);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(accept()));
}

AuthForm::~AuthForm()
{
}

QString & AuthForm::user() const
{
    return ui.userLineEdit->text().trimmed();
}

QString & AuthForm::pass() const
{
    return ui.passLineEdit->text().trimmed();
}


PM MAIL   Вверх
Elfebet
Дата 29.9.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Хм... отнаследуйся от QWidget вместо QMainWindow и все дела!


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
aspirin2003
Дата 29.9.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(Elfebet @ 29.9.2008,  12:48)
Хм... отнаследуйся от QWidget вместо QMainWindow и все дела!

Нельзя, мне dock widgets нужны и т.п.
PM MAIL   Вверх
Elfebet
Дата 29.9.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Тогда единственный правильный вариант - это показать свой диалог перед созданием главного виджета и случае отмены выйти из программы или показать диалог (со случаем закрытия программы) после созданияи и активации главного окна (например в конце конструктора создать таймер, и через некоторое время вызвать этот диалог ), но не в КОНСТРУКТОРЕ главного окна.

ps. склоняюсь больше к первому варианту


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
oagafonov
Дата 29.9.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



Зачем вызывать форму аутентификации в конструкторе главного окна?
Я обычно это делаю в процедуре main, и затем если аутентификация прошла успешно, то запускаю главное окно.

Это сообщение отредактировал(а) oagafonov - 29.9.2008, 14:55
PM MAIL   Вверх
aspirin2003
Дата 29.9.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(oagafonov @ 29.9.2008,  14:52)
Зачем вызывать форму аутентификации в конструкторе главного окна?
Я обычно это делаю в процедуре main, и затем если аутентификация прошла успешно, то запускаю главное окно.

В моем случае аутентификация проходит на сервере, а это значит, что в main мне также нужно перетаскивать код, отвечающий за сетевое соединение, SSL-шифрование, и парсинг XML (протокол взаимодействия на нем основан).
Это не есть гут, с моей точки зрения.

Добавлено через 2 минуты и 58 секунд
Цитата(Elfebet @ 29.9.2008,  14:49)
Тогда единственный правильный вариант - это показать свой диалог перед созданием главного виджета и случае отмены выйти из программы или показать диалог (со случаем закрытия программы) после созданияи и активации главного окна (например в конце конструктора создать таймер, и через некоторое время вызвать этот диалог ), но не в КОНСТРУКТОРЕ главного окна.

ps. склоняюсь больше к первому варианту

С таймером это вообще извращение какое-то  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.