Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Наследование виджета
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
silver47
Есть два класса, наследованые от QWidget, каждый выполняет свою работу. Один из них предоставляет поле для ввода информации и 2 кнопки, Ок + Отмена, нужно чтобы второй запускался и создавался только, если нажата кнопка Ок, при нажатии кнопки отмена, происходило закрытие приложения. Как это возможно сделать?

Спасибо.
molchanoviv
Ну по сигналу от кнопки Ок вызывать слот который будет показывать второй виджет.
silver47
Цитата(molchanoviv @ 14.4.2010, 11:09) *
Ну по сигналу от кнопки Ок вызывать слот который будет показывать второй виджет.


в main создать его а в slotOkBtnClick его показать? Как тогда передать в первый виджет второй, который создан в функции main, и первый виджет ничего не знает о его существовании. Как тогда спрятать первый виджет от глаз подальше?

:blink:
molchanoviv
Цитата(silver47 @ 14.4.2010, 9:25) *
Как тогда передать в первый виджет второй


Не понял. Всмысле передавать первый виджет во второй?

Цитата(silver47 @ 14.4.2010, 9:25) *
Как тогда спрятать первый виджет от глаз подальше?


QWidget::hide ()
или setVisible(0)
MJIbIu
Цитата(silver47 @ 14.4.2010, 6:56) *
Есть два класса, наследованые от QWidget, каждый выполняет свою работу. Один из них предоставляет поле для ввода информации и 2 кнопки, Ок + Отмена, нужно чтобы второй запускался и создавался только, если нажата кнопка Ок, при нажатии кнопки отмена, происходило закрытие приложения. Как это возможно сделать?

Спасибо.

CODE
#include <QtGui/QApplication>
#include "widget.h"
#include "widget2.h"

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

QObject::connect(&w, SIGNAL(signalOK()), &w2, SLOT(slot()));
QObject::connect(&w2, SIGNAL(signal()), &w, SLOT(slotVisible()));

QObject::connect(&w, SIGNAL(signalCancel()), &w, SLOT(close()));

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


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

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QObject::connect(ui->pushOK, SIGNAL(clicked()), this, SLOT(slotOK()));
QObject::connect(ui->pushCancel, SIGNAL(clicked()), this, SLOT(slotCancel()));
}

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

void Widget::changeEvent(QEvent *e)
{
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}

void Widget::slotOK()
{

emit signalOK();

}

void Widget::slotVisible()
{

close();

}

void Widget::slotCancel()
{

emit signalCancel();

}


CODE
#include "widget2.h"
#include "ui_widget2.h"

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

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

void widget2::changeEvent(QEvent *e)
{
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}

void widget2::slot()
{
show();
emit signal();
}


Определение класса я думаю выкладывать не надо.
хз мб я и криво сделал где можно что улучшит напишите плиз буду признателен
silver47
main.cpp

#include <QtGui>
#include "widget.h"
#include "start.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);  
    Start WELCOME; // создаю первый виджет
    Widget w; // создаю второй
    WELCOME.show(); // показываю первый
    return a.exec();
}


start.cpp

Start::Start(QWidget *parent) : QWidget(parent) , m_settings("SilverSoft","Violations") //конструктор
{
...
}

void Start::slotGo(){
    ...

// как здесь отобразить виджет 2, ведь Start ничего не знает о существовании w?
// вообще нужно бы сдесь создать этот виджет, чтобы конструктор w выполнялся только после нажатия кнопки, но в таком случае
// окошко со вторым виджетом появляется и исчезает :(
}


Простите, я любитель и все никак не могу сообразить как это сделать...

silver47
MJIbIu,

Я не использую конструктор для создания окошек, все ручками пока делаю :)

смысл приблизительно понял при подаче сигнала ОК от первого виджета выполняется содержимое slot второго (нужно будет туда чатсть кода конструктора перенести), и слот второго уже подает сигнал для закрытия первого виджета :) вроде все просто... как раньше не дошел :(

Спасибо MJIbIu. Работает, осталось часть кода из конструктора перенести в слот активации второго виджета. Главное что в голове ясно стало как подобное делается :)
:clapping:
MJIbIu
Цитата(silver47 @ 14.4.2010, 13:51) *
MJIbIu,
и слот второго уже подает сигнал для закрытия первого виджета :)

смотря какой алгоритм и что ты хочешь
можно и так сделать

QObject::connect(&w, SIGNAL(signalOK()), &w, SLOT(close()));

// QObject::connect(&w2, SIGNAL(signal()), &w, SLOT(slotVisible()));

можно к одному сигналу разные слоты присоединить. И не ждать что второй виджет вышлет сигнал на закрытие первого виджета
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.