LinuxForum.Fans
Тема

QT закрытие формы

Автор: gen 21 сообщений 9636 просмотров
#103565

Вообщем у меня 2 формы.
Надо чтобы при закрытии первой , вторая тоже закрывалась.
В main.cpp

text

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "dialog.h"

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

Dialog r; r.show();

return a.exec(); }

r это вторая форма которую надо закрыть.
То есть это будет r.closed(); только в деструкторе 1 формы так писать не дает компилятор. Как лучше сделать?

#103584

не совсем понятна логика... для чего... ?... но как один из вариантов... добавить к MainWindow сигнал который будет испускаться при его закрытии ... испускать сигнал из переопределнного

text
void QWidget::closeEvent ( QCloseEvent * event )   [virtual protected]

.... сигнал соединить со слотом close() диалога...

#103597

не совсем понятна логика... для чего... ?...

чтобы когда открывая приложение и поработав с ним, затем желая закрыть - не приходилось закрывать 2 окна.

В MainWindow.Cpp ?

text
void MainWindow::closeEvent(QCloseEvent * event ){
Dialog r;
r.closed();
}

он ничего не знает про r.



: error: no 'void MainWindow::closeEvent(QCloseEvent*)' member function declared in class 'MainWindow'

#103604

Это вы нечто типа SDI делаете?
Почем не "рожать" второе окно из MainWindow?

Можно попробовать примерно так. В MainWindow определить (переопределить onClose, кажеться) метод работающий по закрытию окна. В нем нечто подобное:

text

    foreach (QWidget *win, QApplication::topLevelWidgets())
    {
        if (Dialog *dlg = qobject_cast<Dialog *>(win))  dlg->close();
    }

Хотя удобнее пожалуй через слоты

#103605
gen написал:
он ничего не знает про r.

не

text

    app.connect(mainWin,SIGNAL(destroyed()),dlg,SLOT(close()));
#103628

А где слот этот писать? В конструкторе 1 формы?

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

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->SliderA->setRange(-180,180); ui->SliderB->setRange(-180,180); ui->spinBoxA->setRange(-180,180); ui->spinBoxB->setRange(-180,180);

QObject::connect(ui->SliderA, SIGNAL(valueChanged(int)), ui->spinBoxA, SLOT(setValue(int))); QObject::connect(ui->SliderB, SIGNAL(valueChanged(int)), ui->spinBoxB, SLOT(setValue(int))); QObject::connect(MainWindow,SIGNAL(destroyed()),Dialog,SLOT(close())); }

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

error: expected primary-expression before ',' token
error: 'Dialog' was not declared in this scope

#103636

в main()

text

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "dialog.h"

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

Dialog r; r.show(); QObject::connect(&w,SIGNAL(destroyed()),&r,SLOT(close()));

return a.exec(); }

по Qt есть хорошие книги... и причем на русском...

#103707

smile
скомпилировался , но не закрыл 2 форму

#103784

На самом деле событие destroyed() у главного окна происходит только когда application выходить из exec() т.е. после закрытия диалогового окна.... Соответственно это и не работает.

Я бы все же поступил иначе. 2 пути:
1. Диалог создавал бы из главного окна
2. Создал бы класс на базе QApplication и создал бы внутри него оба окна. (хотя так не пробовал)

#103873
text
Диалог создавал бы из главного окна

в конструкторе?

А весь функционал, расчеты для 2 формы тоже в конструкторе 1 писать прийдется?

2. Создал бы класс на базе QApplication и создал бы внутри него оба окна. (хотя так не пробовал

ух...

#103876
gen написал:

в конструкторе?

Это уж как вам надо - можно и там.

gen написал:

А весь функционал, расчеты для 2 формы тоже в конструкторе 1 писать прийдется?

Ну вообще функционал формы по хорошему должен быть в ее классе. А все общение между главным окном и этой формой организовывать либо чрез public- методы, либо через сигнал-слот (это уже зависит от конкретных задач)

#103913

процитирую самого себя.. :)

добавить к MainWindow сигнал который будет испускаться при его закрытии ... испускать сигнал из переопределнного
void QWidget::closeEvent ( QCloseEvent * event ) [virtual protected]
.... сигнал соединить со слотом close() диалога...

итого
в mainwindow.h добавляем...

text

.......
signals:
       void sigClose();
........

в mainwindow.cpp

text

.........
void MainWindow::closeEvent(QCloseEvent *event)
{
        emit sigClose();
        event->accept();
}
.........................

в main.cpp

text

.................
QObject::connect(&w,SIGNAL(sigClose()),&r,SLOT(close()));
.................

но ИМХО это костыль... может пересмотреть архитектуру (ну либо ее реализацию)?

#103929

error: no 'void MainWindow::closeEvent(QCloseEvent*)' member function declared in class 'MainWindow'

Я не знаю почему он не знает это событие, возможно нужно подключить в инклуде че то...

http://www.easy-share.com/1913166861/WORK.zip

#103934

прошу прощения .. исправляюсь
в mainwindow.h

text

.......
signals:
       void sigClose();
protected:
      virtual void closeEvent(QCloseEvent *event);
........
#103942

благодарствую. smile

#104247

а вот если надо обратиться к какому-нибудь элементу управления второй формы?
н-р дальше ui не катит... Когда пишу -> , подчеркивает строку красным просто...

QObject::connect(&w, SIGNAL(SliderBScroll(int)), &r.ui, SLOT(setText(QString)));

#104264

больше кода... что есть ui? ... да и надо бы наверное c++ подтянуть....

#104272
gen написал:
QObject::connect(&w, SIGNAL(SliderBScroll(int)), &r.ui, SLOT(setText(QString)));

Попробуйте скомпилировать, среди сообщений ошибка будет описана. Не глядя на полный код взгляд спотыкается на разности типов параметра сигнала и слота

#104276
voral написал:
[quote=gen]QObject::connect(&w, SIGNAL(SliderBScroll(int)), &r.ui, SLOT(setText(QString)));

[/quote]
что то не нравиться мне ваш сигнал :)
В какой момент вы его "испускаете"?
Судя по названию вы хотите отобразить позицию скроллера в другом окне?

На сколько я помню объект скроллера выдает какойто сигнал на изменение позиции.
Вам надо написать такой слот setText который принимает параметр именно того типа, что приносит уавливаемый сигнал, а уже в коде слота преобразовывать в текст.

#104414

ругается вот на это

text
&r.ui
Войдите или зарегистрируйтесь, чтобы ответить.