Russian Qt Forum
Ноябрь 26, 2024, 14:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: 2 формы и управление ими  (Прочитано 8858 раз)
Victor007
Гость
« : Март 18, 2013, 15:43 »

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

Очевидно же что симметрично первому варианту))
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Март 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()
{

}
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #3 : Март 18, 2013, 17:27 »

Жмите Веселый
Записан
Victor007
Гость
« Ответ #4 : Март 18, 2013, 17:57 »

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Март 18, 2013, 18:06 »

интересно зачем было писать второй абсолютно идентичный класс
Другими словами, если я просто пишу в обработчике нажатия на кнопку w2.show(); то выдается ошибка. Как сделать, чтобы класс виделся в разных файлах?
show() — это слот. намёк ясен?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Victor007
Гость
« Ответ #6 : Март 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, то все прекрасно выводится.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Март 18, 2013, 21:10 »

про второй класс я обращался к коду demaker'a, забыл процитировать его сообщение
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Victor007
Гость
« Ответ #8 : Март 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 отличается достаточно сильно.
Записан
mutineer
Гость
« Ответ #9 : Март 19, 2013, 12:56 »

Решаются эти проблемы действительно просто - необходимо подтянуть плюсы, в частности видимость переменных, классы и все такое))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 19, 2013, 13:05 »

Можно так
Код
C++ (Qt)
void Widget::on_pushButton_clicked()
{
   emit showW2();
}
 
Завести сигнал showW2() и в main связать его со слотом show() для w2. А можно и проще (и наверно лучше) - ведь on_pushButton_clicked() слот срабатывющий по какому-то сигналу - его и вяжите на show
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Март 19, 2013, 13:41 »

Можно так
В Qt сигнал можно связывать не только со слотом, но и с другим сигналом.
Записан
Victor007
Гость
« Ответ #12 : Март 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.

Что делаю не так?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Март 19, 2013, 14:30 »

Код
C++ (Qt)
QObject::connect(w, SIGNAL(showW2()), w2, SLOT(show()));
И если опыта в языке маловато, то лучше всей той высокоуровневой лабудой (сигналами и пр) не увлекаться (еще успеете)
Записан
Victor007
Гость
« Ответ #14 : Март 19, 2013, 14:48 »

Всем большое спасибо за ценные и оперативные ответы! Особенно Igors! Наконец-то получилось то, с чем я возился много дней подряд. Начал понимать механизм сигналов и слотов. Воистину, один разобранный пример стоит многих страниц руководства. Отдельное спасибо за совет. Да, мне уже понятно, что Qt - крепкий орешек, но очень интересный)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.142 секунд. Запросов: 23.