crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Две формы !, проблемка при функции show() у второй формы
maxvanceffer
  опции профиля:
сообщение 13.6.2009, 21:43
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

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




Репутация:   0  


А можно маленикй пример ... А что то туго как то доходит.

Вот пример :
это в классе первого окна обьява
Second *window;
в реализации первого класса :
window=new Second(this);

а вот во втором классе как к этому обратиться через this?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.6.2009, 22:06
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(maxvanceffer @ 14.6.2009, 1:43) *
window=new Second(this);

а вот во втором классе как к этому обратиться через this?
покажи объявление второго класса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maxvanceffer
  опции профиля:
сообщение 13.6.2009, 22:13
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

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




Репутация:   0  


Раскрывающийся текст
namespace Ui {
class SettingDialog;
}

class SettingDialog : public QDialog {
Q_OBJECT
Q_DISABLE_COPY(SettingDialog)
public:
explicit SettingDialog(QWidget *parent = 0);
virtual ~SettingDialog();
void initVars(QString SettingFile);

protected:
virtual void changeEvent(QEvent *e);

private:
Ui::SettingDialog *m_ui;
void startup();
int Changes;
QString Settings;
QMessageBox *mes;

private slots:
void on_exitButton_clicked();
void on_autoLoginCheckBox_stateChanged(int );
void on_popupCheckBox_stateChanged(int );
void on_saveButton_clicked();

signals:
void closeEvent();
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.6.2009, 22:18
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(maxvanceffer @ 13.6.2009, 22:43) *
А можно маленикй пример ... А что то туго как то доходит.

Вот пример :
это в классе первого окна обьява
Second *window;
в реализации первого класса :
window=new Second(this);

а вот во втором классе как к этому обратиться через this?

Если я правильно понял вопрос, то ты хочешь из Second получить доступ к родительскому окну?
void Second::method()
{
    First *wnd = qobject_cast<First*>( parent() );
    Q_ASSERT( wnd != 0 );
    wnd->method();
}


Сообщение отредактировал BRE - 13.6.2009, 22:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.6.2009, 22:39
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


1) Один вариант тебе написал BRE.
2) Второй вариант, как и первый, только убрать приведение типа, и вызывать метод show (приведение не нужно т.к. это родной метод QWidget)

Т.к. у тебя второе окно наследник от QDialog, то могут быть ещё два варианта:
3) Перед вызовом твоего диалога, соедени его сигнал void finished ( int result ) со слотом show первого окна.

4) А может стоит пользоваться модальным диалогом? Я сильно сомневаюсь, что основное окно будет мешать пользователю. А вот исчезновение главного окна а потом появление, т.е мелькание окон, явно его выведет из равновесия.

Цитата(maxvanceffer @ 14.6.2009, 2:13) *
signals:
void closeEvent();
вот это зря. с таким именем, хоть и с другой сигнатурой, уже есть функция у базового класса (QWidget). Лучше придумай другое имя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.6.2009, 22:45
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(Litkevich Yuriy @ 13.6.2009, 23:39) *
2) Второй вариант, как и первый, только убрать приведение типа, и вызывать метод show (приведение не нужно т.к. это родной метод QWidget)

Метод parent описан в QObject и соответственно возвращает указатель на QObject. Приведение типа все равно нужно, правда приводить можно к QWidget.

Цитата
QObject * QObject::parent () const
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maxvanceffer
  опции профиля:
сообщение 13.6.2009, 23:26
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

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




Репутация:   0  


Ура всем спосибо получилась по примеру BRE , пытался соединять раньше сигна со слотом из главного в ребёнка но не срабатывала. Но по совету BRE получилось !!! Еще поиграюсь сразными возожнастями .... щас читаю статейку об этом....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.6.2009, 0:22
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(BRE @ 14.6.2009, 2:45) *
Метод parent описан в QObject и соответственно возвращает указатель на QObject.
Пардон, я недосказал:
Я имел в виду указатель на родителя parent, передаваемый в конструктор, вместо метода parent()
explicit SettingDialog(QWidget *parent = 0);
см. код maxvanceffer в 13 сообщении. Но, как я и говорил - это способ для данного конкретного случая. У BRE - универсальный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.6.2009, 12:44
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(BRE @ 13.6.2009, 23:18) *
Если я правильно понял вопрос, то ты хочешь из Second получить доступ к родительскому окну?
void Second::method()
{
    First *wnd = qobject_cast<First*>( parent() );
    Q_ASSERT( wnd != 0 );
    wnd->method();
}


Q_ASSERT ничего не пишет в консоль при release сборке, в любом случае программа продолжит своё выполнение и выпадет по AV. Кстати достаточно написать так Q_ASSERT(wnd);, но в любом случае это только лишь warning в debug сборке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.6.2009, 13:06
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(SABROG @ 14.6.2009, 13:44) *
Q_ASSERT ничего не пишет в консоль при release сборке, в любом случае программа продолжит своё выполнение и выпадет по AV.

Она и не должна ничего писать в релизе, такие ошибки должны выявляться на этапе отладки.

Цитата(SABROG @ 14.6.2009, 13:44) *
Кстати достаточно написать так Q_ASSERT(wnd);

Свой код я так и пишу, никогда не делаю сравнение с 0. Либо if( wnd ), либо if( !wnd ). Но это вопросы стиля написания, у каждого свои предпочтения. ;)

Цитата(SABROG @ 14.6.2009, 13:44) *
но в любом случае это только лишь warning в debug сборке.

Это варнинг и abort.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 29.3.2024, 1:59