crossplatform.ru

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


  Ответ в [Не решено]MdiArea, закрытие потомков
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
grio Дата 18.5.2010, 17:33
 
Цитата(breeve @ 14.5.2010, 12:54) *
Исправил я одну проблему осталась другая. Как мне отлавливать смену фокуса на любое другое приложение? Программа падает если я нажимаю куда угодно только не на нее.


Ящитаю, твой код надо пересмотреть в сторону использования механизма сигналов и слотов для взаимодействия потомков.
breeve Дата 14.5.2010, 12:54
  Исправил я одну проблему осталась другая. Как мне отлавливать смену фокуса на любое другое приложение? Программа падает если я нажимаю куда угодно только не на нее.
breeve Дата 14.5.2010, 9:48
 
Цитата(grio @ 13.5.2010, 18:07) *
Зачем ты используешь qobject_cast, когда есть специальная функция QMdiArea::currentSubWindow () const

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

Исправил. В функции смена фокуса вставил такую строку:
if(mainArea->subWindowList().isEmpty())
        return;
grio Дата 13.5.2010, 17:07
 
Цитата(breeve @ 13.5.2010, 15:31) *
grio, сделал так как ты сказал, те же яйца только в профиль.. Программа все равно падает


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

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


breeve Дата 13.5.2010, 15:31
  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();
}
grio Дата 13.5.2010, 15:05
  Когда закрываешь дочернее окно - посылай сигнал родителю.
Я делаю так, к примеру:
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();
}
breeve Дата 13.5.2010, 15:02
  Заметил такую особенность что программа падает, не при закрытии окна-потомка, а если фокус с окна-потомка перейдет на что-либо другое. если перевести фокус на другое приложение, мое тоже падает.
breeve Дата 13.5.2010, 13:49
  Если в 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();
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:55