Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] не удаляется дочернее окно с QMdiArea, не спервого раза ... 
V
    Опции темы
zloyGamer
Дата 17.5.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



создаю несколько дочерних окон myQDialog (наследников от QDialog) в QMdiArea главного окна...
все работает вроде ок.., но при удалении любого первого окна - оно просто очищается(удаляются все элементы формы) и остается просто пустое окно... но при повторном вызове этогоже метода удаления оно удаляется.., и после остальные окна при вызове этогоже метода удаляются полностью..

непонимаю в чем может быть причина?

сам метод удаления нескока раз пытался править:
myQDialog_window->deleteLater();
myQDialog_window->close();
delete myQDialog_window;
... //и так далее

 - но видимо не в нем дело, гдето остаются какието связи с этим окном раз оно не с первого раза сносится...
подскажите какие типы связей мне искать, или в каком направлении копать?
что может мешать удалению дочернего окна полностью и с первого раза?
PM MAIL   Вверх
Remiznik
Дата 17.5.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



на код бы посмотреть ! 
а то может ты случайно перегрузил функцию закрытия и отвественость за удаление легла на тебя =)
PM MAIL   Вверх
zloyGamer
Дата 19.5.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



нет ничего не перегружая и никого не напрягая просто создал нов. пустой проект с 2 окнами,
в нем получается почти таже ситуация что и в исходном проекте, также после удаления висит пустое окно - которое удаляется этимже методом при его повторном вызове,
а теперь внимание вопрос: почму?

в архиве готовый проект, гляньте может будут какие мысли..

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  my_proj4.test.7z 2,26 Kb
PM MAIL   Вверх
SABROG
Дата 19.5.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Че за радости такие?

Код

Object::connect: No such slot Form1::aga_0001()
Object::connect:  (sender name:   'pushButton_2')
Object::connect:  (receiver name: 'Form1')
QMetaObject::connectSlotsByName: No matching signal for on__pushButton_1__click(
)
QMetaObject::connectSlotsByName: No matching signal for on__pushButton_2__click(
)
Form1::Form1() CREATE  "b25eb0"
"MainWindow::add_new_window(QDialog *p_QDialog) p_QDialog ==b25eb0"
Object::connect: No such slot Form1::aga_0001()
Object::connect:  (sender name:   'pushButton_2')
Object::connect:  (receiver name: 'Form1')
QMetaObject::connectSlotsByName: No matching signal for on__pushButton_1__click(
)
QMetaObject::connectSlotsByName: No matching signal for on__pushButton_2__click(
)
Form1::Form1() CREATE  "b53320"
p_MainWindow =  "22ff30"     m_pForm1 =  "b53320"
"MainWindow::add_new_window(QDialog *p_QDialog) p_QDialog ==b53320"



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 19.5.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Может я немного не понял код, но возник вопрос. Если каждый SubWindow может пораждать другие SubWindow'ы, а переменная
Form1        *m_pForm1; - одна, то при нажатии на button2 первого окна что должно удаляться, варианты ответов:
  • a) само окно
  • б) первое порожденное окно
  • в) последнее порожденное окно
Цитата

parentSubWindow
|
|_childSubWindow1
|
|_childSubWindow2


---
Насчет того почему очищается при удалении. QMdiSubWindow - контейнер, который содержит в себе QWidget. Если ты не передаешь QMdiSubWindow в метод QMdiArea::addSubWindow, а передаешь QWidget, то QMdiArea создает контейнер сама и помещает в него твой переданный QWidget. Поэтому при вызове deleteLater() у Form1 - очищается контейнер (QMdiSubWindow::widget()), т.к. ты удаляешь виджет помещенный на нем.

Всё сводится к следующему коду:

//mainwindow.cpp
Код

void MainWindow::add_new_window(QMdiSubWindow *p_QDialog)
{
    qDebug()<<"MainWindow::add_new_window(QDialog *p_QDialog) p_QDialog ==" + QString::number((int)p_QDialog,16) ;

    QMdiSubWindow *sub = ui->mdiArea->addSubWindow(p_QDialog);
    sub->setAttribute(Qt::WA_DeleteOnClose);
    sub->show();
}


//form1.cpp

Код

void Form1::on__pushButton_2__click()
{
    parent()->deleteLater();
}


Происходит следующее:
Добавляем свой виджет(Form1) на автоматически созданный контейнер (QMdiSubWindow)
Берем возвращенный указатель на этот контейнер и устанавливаем ему флаг, чтобы при закрытии он удалялся
Т.к. контейнер является временным приемным родителем, то при удалении родителя будут уничтожены все его дети (Form1)
При нажатии на вторую кнопку говорим родителю совершить самоубийство (deleteLater) как только возвратимся в основной цикл событий (такое вот извращенное самоубийство через родителя).

Только надо сделать полный рефакторинг кода и нормально унаследоваться от QMdiSubWindow, а то ты похоже сам запутался в своих приведениях указателя QDialog/QWidget->QMdiSubWindow.

Это сообщение отредактировал(а) SABROG - 19.5.2009, 21:49


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zloyGamer
Дата 19.5.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



вооот оно что, вот оно как - значит все это время она создавала новое окно типа QMdiSubWindow - и уже на нем вырисовывала мое окно QDialog, вооот блииин а я никак немог допетрить что вообще происходит, и в доках вроде никто ничего об этом не упомянул...

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

а насчет:
Цитата

Может я немного не понял код, но возник вопрос. Если каждый SubWindow может пораждать другие SubWindow'ы, а переменная
Form1        *m_pForm1; - одна, то при нажатии на button2 первого окна что должно удаляться, варианты ответов:

    * a) само окно
    * б) первое порожденное окно
    * в) последнее порожденное окно

 - вариант в) - удалено будет последнее порожденное окно, просто ничего разумнее для примера не придумал... насамом деле в другом проекте куча куча всякого хлама + кода которые к проблеме не относятся, но всеже, вот с этим:
Код

QMetaObject::connectSlotsByName: No matching signal for on__pushButton_1__click(
)
QMetaObject::connectSlotsByName: No matching signal for on__pushButton_2__click(
)

там тоже засада, получается что нет какогото сигнала по умолчанию для слотов on__pushButton_X__click - как отключить этот поиск стандартных сигналов для моих слотов?, я ведь сам могу все что мне надо будет подключить - отключить..
PM MAIL   Вверх
SABROG
Дата 19.5.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(zloyGamer @  19.5.2009,  23:05 Найти цитируемый пост)
и в доках вроде никто ничего об этом не упомянул...


Цитата(zloyGamer @  19.5.2009,  23:05 Найти цитируемый пост)
ведь тут вообще неявно все протекало...


Внимательней читать надо:

Цитата

The widget can be either a QMdiSubWindow or another QWidget (in which case the MDI area will create a subwindow and set the widget as the internal widget).



Цитата(zloyGamer @  19.5.2009,  23:05 Найти цитируемый пост)
как отключить этот поиск стандартных сигналов для моих слотов?

Попробуй изменить вид слотов с on__pushButton_1__click на onPushButton1click, или любое другое но, чтобы не была форма on_xxx_имясигнала.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zloyGamer
Дата 20.5.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



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

а про:
Цитата

The widget can be either a QMdiSubWindow or another QWidget (in which case the MDI area will create a subwindow and set the widget as the internal widget).
дествительно невидел этого...,

ещё раз спасибо..
тема закрыта.

Это сообщение отредактировал(а) zloyGamer - 20.5.2009, 16:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.