crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Наследование виджета
silver47
  опции профиля:
сообщение 14.4.2010, 5:56
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Есть два класса, наследованые от QWidget, каждый выполняет свою работу. Один из них предоставляет поле для ввода информации и 2 кнопки, Ок + Отмена, нужно чтобы второй запускался и создавался только, если нажата кнопка Ок, при нажатии кнопки отмена, происходило закрытие приложения. Как это возможно сделать?

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 14.4.2010, 8:09
Сообщение #2


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Ну по сигналу от кнопки Ок вызывать слот который будет показывать второй виджет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 14.4.2010, 8:25
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


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


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

:blink:
Причина редактирования: Убрал дубль.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 14.4.2010, 8:44
Сообщение #4


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


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


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

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


QWidget::hide ()
или setVisible(0)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 14.4.2010, 10:25
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 14.4.2010, 10:39
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


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
  опции профиля:
сообщение 14.4.2010, 12:51
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


MJIbIu,

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

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

Спасибо MJIbIu. Работает, осталось часть кода из конструктора перенести в слот активации второго виджета. Главное что в голове ясно стало как подобное делается :)
:clapping:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 14.4.2010, 13:34
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(silver47 @ 14.4.2010, 13:51) *
MJIbIu,
и слот второго уже подает сигнал для закрытия первого виджета :)

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

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

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

можно к одному сигналу разные слоты присоединить. И не ждать что второй виджет вышлет сигнал на закрытие первого виджета
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.11.2019, 23:20