Russian Qt Forum
Июня 08, 2025, 16:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема при закрытии формы  (Прочитано 5225 раз)
slava_d200
Гость
« : Июня 17, 2012, 03:12 »

Прошу подсказки.
есть MDI приложение.
создаю форму на основании QWidgate.
при открытии формы добавляю ее в QMdiArea
на этой форме есть кнопка которая посылает сигнал CLOSE()
так вот при нажатии на эту кнопку сама кнопка пропадает, а форма не закрывается.
а если нажать "Х" то все нормально закрывается.
полагаю что проблема в добавлении формы в QMdiArea (если не добавлять то все хорошо).

ВОПРОС: чем отличается нажатие кнопки "Х" и команды  CLOSE()
разве "Х" не генерит туже самую команду.

Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Июня 17, 2012, 05:36 »

ну наверное потому, что ты "закрываешь" виждет, а не QMdiSubWindow. Попробуй делать так:

Код
C++ (Qt)
QMdiSubWindow *sw = mdiArea->addSubWindow(widget);
connect(widget, SIGNAL(closeButtonPushed()), sw, SLOT(close()));
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
slava_d200
Гость
« Ответ #2 : Июня 17, 2012, 10:01 »


Код
C++ (Qt)
QMdiSubWindow *sw = mdiArea->addSubWindow(widget);
connect(widget, SIGNAL(closeButtonPushed()), sw, SLOT(close()));

Действительно. такой код сработал. спасибо.

но вопрос остался прежним.
почему при нажатии на "Х" все отрабатывает корректно, а программно НЕТ.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июня 17, 2012, 10:12 »

Вам уже ответили - скорее всего потому, что вы вызывали close не у окна, а у самой кнопки. При этом она собственно и исчезала.
Ну это в рамках телепатии и прорицания. Точнее только если вы выложите тот глючащий код.
Записан
slava_d200
Гость
« Ответ #4 : Июня 17, 2012, 10:35 »

Вам уже ответили - скорее всего потому, что вы вызывали close не у окна, а у самой кнопки. При этом она собственно и исчезала.
Ну это в рамках телепатии и прорицания. Точнее только если вы выложите тот глючащий код.

Улыбающийся я же уже писал что если не добавлять форму в QMdiArea что все корректно отрабатывает. откуда уже можно сделать вывод
что сигналы настроены верно. если бы сигнал был не верный. то он бы и в этом случае тоже сработал бы так же.
а во вторых если на форму накидать еще всяких кнопок виджетов и т.д. то они пропадают так же как пропадает нажимаемая кнопка.
вот код самой формы


CRm::CRm(QWidget *parent) :
    QWidget(parent)
{
    setupUi(this);
    //connect(this->pushButton,SIGNAL(clicked()),this,SLOT(_close()));
    connect(this->pushButton,SIGNAL(clicked()),this,SLOT(close()));
}

void CRm::_close()
{
    //QCloseEvent *i = new QCloseEvent();

    //QWidget::closeEvent(i);

    //this->close();
}

а так я создаю:

        CRm * Spr = new CRm(this);
        Spr->setObjectName(sender()->objectName());
        Spr->setAttribute(Qt::WA_DeleteOnClose);
        Spr->setWindowTitle(QObject::tr("Справочник: ""Рабочие места"""));

        QMdiSubWindow *sw = new QMdiSubWindow();
        sw->setAttribute(Qt::WA_DeleteOnClose);
        sw->setWidget(Spr);
        m_pws->addSubWindow(sw);

        //connect(Spr->pushButton,SIGNAL(clicked()),sw,SLOT(close()));

        Spr->show();

« Последнее редактирование: Июня 17, 2012, 10:42 от slava_d200 » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #5 : Июня 17, 2012, 15:14 »


Код
C++ (Qt)
QMdiSubWindow *sw = mdiArea->addSubWindow(widget);
connect(widget, SIGNAL(closeButtonPushed()), sw, SLOT(close()));

Действительно. такой код сработал. спасибо.

но вопрос остался прежним.
почему при нажатии на "Х" все отрабатывает корректно, а программно НЕТ.
Код
C++ (Qt)
QMdiSubWindow *sw = mdiArea->addSubWindow(widget);
connect(widget, SIGNAL(closeButtonPushed()), sw, SLOT(close()));
это разве не программно? А вызвав слот close у своего виджета ты "закрыл" свой виджет, на котором была кнопка, а не контейнер QMdiSubWindow, в котором храниться твой виджет. Можно еще попробовать у QMdiSubWindow сделать родителем твой виджет
Код
C++ (Qt)
   QMdiSubWindow *sw = mdiArea->addSubWindow(widget);
   sw->setParent(widget);
и тогда при уничтожении виджета уничтожится и контейнер. Сумбурно, конечно, но как мог.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
slava_d200
Гость
« Ответ #6 : Июня 17, 2012, 23:39 »

Да это все понятно. спасибо.

Я хочу теперь узнать тока одно.

что за сигнал подается когда нажимается "Х" на форме.
что он еще и гасит QMdiSubWindow
« Последнее редактирование: Июня 18, 2012, 00:33 от slava_d200 » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Июня 18, 2012, 06:49 »

Блин. Сингнал никакой не подается, вызывается слот void QMdiSubWindow::close().
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 3.19 секунд. Запросов: 23.