Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Victor007 от Март 18, 2013, 15:43



Название: 2 формы и управление ими
Отправлено: Victor007 от Март 18, 2013, 15:43
Здравствуйте!
Создал тестовое приложение с 2-мя формами. Добился того, что по нажатию на кнопку на первой форме закрывается вторая. Теперь хочу сделать то же самое, но чтобы закрывалась первая форма (Form1) по нажатию кнопки (pushButton 3) на форме 2 (Form2). Как это сделать? Заранее спасибо!


Название: Re: 2 формы и управление ими
Отправлено: mutineer от Март 18, 2013, 15:47
Очевидно же что симметрично первому варианту))


Название: Re: 2 формы и управление ими
Отправлено: demaker от Март 18, 2013, 17:26
Код:
#include <QtGui/QApplication>

#include "widget.h"
#include "widget2.h"

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

    Widget w;
    Widget2 w2;

    w.show();
    w2.show();

    QObject::connect(w.pb,SIGNAL(clicked()),&w2,SLOT(close()));
    QObject::connect(w2.pb1,SIGNAL(clicked()),&w,SLOT(close()));

    return a.exec();
}

первый виджет:

Код:

#include "widget.h"
#include "ui_widget.h"

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

    QHBoxLayout* hbl = new QHBoxLayout(this);
    pb = new QPushButton("PushButton1");

    hbl->addWidget(pb);
    setLayout(hbl);
    setFixedSize(150,100);
}

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

второй виджет:
Код:
#include "widget2.h"

Widget2::Widget2(QWidget *parent) :
    QWidget(parent)
{
    QHBoxLayout* hbl = new QHBoxLayout(this);
    pb1 = new QPushButton("PushButton2");

    hbl->addWidget(pb1);
    setLayout(hbl);

    setFixedSize(150,100);
}

Widget2::~Widget2()
{

}


Название: Re: 2 формы и управление ими
Отправлено: demaker от Март 18, 2013, 17:27
Жмите :D


Название: Re: 2 формы и управление ими
Отправлено: Victor007 от Март 18, 2013, 17:57
Спасибо большое за такой развернутый и оперативный ответ! Я заранее извиняюсь, но мне очень важно подробно разобраться в этом примере. Поэтому прошу отнестись терпимо к моим уточняющим вопросам.
У меня в моей версии w2 появляется по нажатию на кнопку на форме w и это стоит в обработчике нажатия на кнопку. Класс определяется там же. Если я определяю
 Widget2 w2;
в main (как у Вас), то в коде для первого виджета он уже становится не виден.
Другими словами, если я просто пишу в обработчике нажатия на кнопку w2.show(); то выдается ошибка. Как сделать, чтобы класс виделся в разных файлах?


Название: Re: 2 формы и управление ими
Отправлено: kambala от Март 18, 2013, 18:06
интересно зачем было писать второй абсолютно идентичный класс
Другими словами, если я просто пишу в обработчике нажатия на кнопку w2.show(); то выдается ошибка. Как сделать, чтобы класс виделся в разных файлах?
show() — это слот. намёк ясен?


Название: Re: 2 формы и управление ими
Отправлено: Victor007 от Март 18, 2013, 18:35
Если Вы про то, что я не то назвал классом, то нет, может быть, просто написал криво. Класс задается в widget2.h. Если про что-то другое, то, увы, не понял намека. Вот такой у меня код:

main:
Код:
#include "widget.h"
#include "widget2.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget *w = new Widget;
    Widget2 *w2 = new Widget2;

    w->show();
   
    return a.exec();
}

widget.cpp:
Код:
#include "widget2.h"
#include "ui_widget.h"

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

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

void Widget::on_pushButton_clicked()
{
    w2->show();
}


Если я пишу w2->show(); в main, то все прекрасно выводится.


Название: Re: 2 формы и управление ими
Отправлено: kambala от Март 18, 2013, 21:10
про второй класс я обращался к коду demaker'a, забыл процитировать его сообщение


Название: Re: 2 формы и управление ими
Отправлено: Victor007 от Март 19, 2013, 12:50
Вы имеете в виду, что можно и w и w2 определить в классе Widget? Но ведь мы же создаем два файла: widget.cpp и widget2.cpp, к ним автоматически создаются хедеры, а там эти классы прописываются опять же автоматически. В любом случае, по сути это ничего не меняет.
У меня получился работающий вариант, но для этого мне приходится переопределять w2 прямо внутри обработчика нажатия на кнопку:

Код:
void MainWindow::on_pushButton_clicked()
{
    Widget2 *w2 = new Widget2;
    w2->show();
}

Но ведь мы уже задавали w2 в main! Значит, это неправильное решение.
Я чувствую, что решается это как-то совсем просто, но никак не могу "нащупать" ответ. Может быть, сказывается привычка программирования в Borland, все-таки Qt отличается достаточно сильно.


Название: Re: 2 формы и управление ими
Отправлено: mutineer от Март 19, 2013, 12:56
Решаются эти проблемы действительно просто - необходимо подтянуть плюсы, в частности видимость переменных, классы и все такое))


Название: Re: 2 формы и управление ими
Отправлено: Igors от Март 19, 2013, 13:05
Можно так
Код
C++ (Qt)
void Widget::on_pushButton_clicked()
{
   emit showW2();
}
 
Завести сигнал showW2() и в main связать его со слотом show() для w2. А можно и проще (и наверно лучше) - ведь on_pushButton_clicked() слот срабатывющий по какому-то сигналу - его и вяжите на show


Название: Re: 2 формы и управление ими
Отправлено: Old от Март 19, 2013, 13:41
Можно так
В Qt сигнал можно связывать не только со слотом, но и с другим сигналом.


Название: Re: 2 формы и управление ими
Отправлено: Victor007 от Март 19, 2013, 14:08
Igors, спасибо большое!
Делаю первый вариант, связываю в main:
 
Код:
Widget *w = new Widget;
Widget2 *w2 = new Widget2;
QObject::connect(&w, SIGNAL(showW2()),&w2, SLOT(show()));

Выдается ошибка: none of the 3 overloads could convert all the arguments types.

Что делаю не так?


Название: Re: 2 формы и управление ими
Отправлено: Igors от Март 19, 2013, 14:30
Код
C++ (Qt)
QObject::connect(w, SIGNAL(showW2()), w2, SLOT(show()));
И если опыта в языке маловато, то лучше всей той высокоуровневой лабудой (сигналами и пр) не увлекаться (еще успеете)


Название: Re: 2 формы и управление ими
Отправлено: Victor007 от Март 19, 2013, 14:48
Всем большое спасибо за ценные и оперативные ответы! Особенно Igors! Наконец-то получилось то, с чем я возился много дней подряд. Начал понимать механизм сигналов и слотов. Воистину, один разобранный пример стоит многих страниц руководства. Отдельное спасибо за совет. Да, мне уже понятно, что Qt - крепкий орешек, но очень интересный)


Название: Re: 2 формы и управление ими
Отправлено: kambala от Март 19, 2013, 15:36
Разобранные примеры есть и в документации ;)


Название: Re: 2 формы и управление ими
Отправлено: Igors от Март 19, 2013, 17:30
Да, мне уже понятно, что Qt - крепкий орешек
Вернее "сладкий" :) который позволяет и без глубокого знания/понимания чего-то клепать. Поэтому увлекаться/злоупотреблять не следует (как с водкой)