crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> [Не решено]MdiArea, закрытие потомков
breeve
  опции профиля:
сообщение 13.5.2010, 13:49
Сообщение #1


Участник
**

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

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




Репутация:   1  


Если в Mdi приложении открыто одно окно и я его закрываю падает вся программа.
Есть функция, смена фокуса. При смене фокуса в PropertyWindow меняются параметры на параметры того окна которое сейчас активно. Если я пишу:
Раскрывающийся текст
connect(mainArea,SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(changeFocus(QMdiSubWindow*)));
...
void TestCreator::changeFocus(QMdiSubWindow *wid)
{
    Test *w = qobject_cast<Test *>(wid);
    if(!w)
        return;
    pOpenTest = w;
    t_line[0].setText(pOpenTest->windowTitle());
}
То он не может конвертировать QMdiSubWindow* в Test*. И соответственно дальше ретурна дело не идет. Если я пишу:
Test *w = qobject_cast<Test *>(wid->widget());
То все правильно привсаивается, меняются параметры, но при закрытии все падает.
Еще я пытался сделать так, у меня есть указатель который указывает на коно которое активно и зменяет его или забирает от туда данные. Указатель класса Test*. Делал как QMdiSubWindow. И изменял параметры через pOpenTest->widget()->myMethod();

Сообщение отредактировал breeve - 14.5.2010, 15:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 13.5.2010, 15:02
Сообщение #2


Участник
**

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

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




Репутация:   1  


Заметил такую особенность что программа падает, не при закрытии окна-потомка, а если фокус с окна-потомка перейдет на что-либо другое. если перевести фокус на другое приложение, мое тоже падает.

Сообщение отредактировал breeve - 13.5.2010, 15:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
grio
  опции профиля:
сообщение 13.5.2010, 15:05
Сообщение #3


Студент
*

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

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




Репутация:   0  


Когда закрываешь дочернее окно - посылай сигнал родителю.
Я делаю так, к примеру:
void MainWindow::on_action_goods_triggered()
{
    goods_form *E_F = new goods_form();
    E_F->setAttribute(Qt::WA_DeleteOnClose);
    QMdiSubWindow *widg = new QMdiSubWindow(this);
    widg->setAttribute(Qt::WA_DeleteOnClose);
    QObject::connect(E_F, SIGNAL(signal_closing()), widg, SLOT(close()), Qt::AutoConnection);
    widg->setWidget(E_F);
    widg->setWindowTitle(tr("Список товаров"));
    widg->setWindowIcon(QIcon (":/icons/goods.ico"));
    widg->setGeometry(QRect(10, 10, 1100, 500));
    add_new_window(widg);
}

void MainWindow::add_new_window(QMdiSubWindow *p_sub)
{
    QMdiSubWindow *sub = ui->mdiArea->addSubWindow(p_sub);
    sub->setAttribute(Qt::WA_DeleteOnClose);
    sub->show();
}


Сообщение отредактировал grio - 13.5.2010, 15:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 13.5.2010, 15:31
Сообщение #4


Участник
**

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

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




Репутация:   1  


grio, сделал так как ты сказал, те же яйца только в профиль.. Программа все равно падает

void TestCreator::newTest()
{
    Test* pTest = new Test(this);
    pTest->setAttribute(Qt::WA_DeleteOnClose);
    QMdiSubWindow *wid = new QMdiSubWindow(this);
    wid->setAttribute(Qt::WA_DeleteOnClose);
    connect(pTest, SIGNAL(destroyed()), wid, SLOT(close()), Qt::AutoConnection);
    wid->setWidget(pTest);
    wid->setWindowTitle(tr("Unnamed Test"));
    createNewTest(wid);
    t_line[0].setText(pOpenTest->windowTitle());
}

void TestCreator::createNewTest(QMdiSubWindow *p_sub)
{
    QMdiSubWindow* sub = mainArea->addSubWindow(p_sub);
    p_sub->setAttribute(Qt::WA_DeleteOnClose);
    p_sub->show();
}


Сообщение отредактировал breeve - 13.5.2010, 15:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
grio
  опции профиля:
сообщение 13.5.2010, 17:07
Сообщение #5


Студент
*

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

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




Репутация:   0  


Цитата(breeve @ 13.5.2010, 15:31) *
grio, сделал так как ты сказал, те же яйца только в профиль.. Программа все равно падает


Получается, что возможно проблема не связана с MdiArea.

Зачем ты используешь qobject_cast, когда есть специальная функция QMdiArea::currentSubWindow () const




Сообщение отредактировал grio - 13.5.2010, 18:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 14.5.2010, 9:48
Сообщение #6


Участник
**

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

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




Репутация:   1  


Цитата(grio @ 13.5.2010, 18:07) *
Зачем ты используешь qobject_cast, когда есть специальная функция QMdiArea::currentSubWindow () const

Есть функция но она возвращает QMdiSubWindow *. А мне необходимо далее использовать методы класса который я вставил методом addSubWindow() . Я могу также сделать currentSubWindow()->widget()->а далее мой метод,но только это не возможно поскольку возвращает он QWidget* а не указатель на мой порожденный от QWidget класс, потому я и перевожу)

Исправил. В функции смена фокуса вставил такую строку:
if(mainArea->subWindowList().isEmpty())
        return;


Сообщение отредактировал breeve - 14.5.2010, 12:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 14.5.2010, 12:54
Сообщение #7


Участник
**

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

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




Репутация:   1  


Исправил я одну проблему осталась другая. Как мне отлавливать смену фокуса на любое другое приложение? Программа падает если я нажимаю куда угодно только не на нее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
grio
  опции профиля:
сообщение 18.5.2010, 17:33
Сообщение #8


Студент
*

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

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




Репутация:   0  


Цитата(breeve @ 14.5.2010, 12:54) *
Исправил я одну проблему осталась другая. Как мне отлавливать смену фокуса на любое другое приложение? Программа падает если я нажимаю куда угодно только не на нее.


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

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


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




RSS Текстовая версия Сейчас: 25.11.2024, 22:48