Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mokynis от Июнь 27, 2010, 04:58



Название: смена активного окна в MDI-приложении
Отправлено: mokynis от Июнь 27, 2010, 04:58
Учу Qt по Шлее, дошел до MDI-приложения. Все, вроде, понятно, но никак не получается сделать так, чтобы при смене активного child-окна в заголовке main-окна отобразился заголовок активного. Если соединяю subWindowActivated со своим слотом changeTitle, то при попытке открыть файл, если уже открыто хоть одно child-окно (не важно, новое или с уже имеющимся файлом), программа "неожиданно завершает работу". Подскажите, пожалуйста, что не так?
вот кусок mdi.cpp
Код:
#include "mdi.h"
#include "ui_mdi.h"

#include "childw.h"

mdi::mdi(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::mdi)
{
    ui->setupUi(this);
.............
    connect(ui->actionLoad,SIGNAL(triggered()),this,SLOT(slotLoad()));
.............
    connect(ui->mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(changeTitle()));
}

.............
void mdi::slotLoad()
{
    childw* pdoc=createNewDoc();
    pdoc->slotLoad();
    this->setWindowTitle(pdoc->windowTitle());
    pdoc->show();
}
.............
void mdi::changeTitle()
{
    this->setWindowTitle(ui->mdiArea->activeSubWindow()->windowTitle());
}
а вот ф-ция, на которой программа спотыкается (childw.cpp)
Код:
..............
void childw::slotLoad()
{
    QString str=QFileDialog::getOpenFileName();
    if(str.isEmpty())
        return;
    QFile file(str);   
    if(!file.open(QFile::ReadOnly))
    {   
        QMessageBox::warning(this,tr("Ошибка открытия"),tr("Не удается открыть файл %1").arg(str));
        return;
    }
    QTextStream instream(&file);   
    ui->textEdit->setPlainText(instream.readAll());
    file.close();   

    this->changeTitle(str);
}


Название: Re: смена активного окна в MDI-приложении
Отправлено: sendevent от Июнь 27, 2010, 06:09
либо с приведенными кусками кода все норм, либо мне совсем пора спать. наверно, надо глянуть в неурезанные исходники, а пока расскажи, откудова определил, что проблема именно в childw::slotLoad, а не в том же mdi::slotLoad (всмысле, createNewDoc стопудова возвращает валидный указатель? стопудова-стопудова? а если найду?) и што происходит внутри childw::changeTitle. (вызывает подозрение строка
Код:
connect(ui->mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(changeTitle()));
- аргументы сигнала/слота не совпадают, точно не пытаешься читать по "несуществующему" указателю?)
вообще же, я залез сюда просто глянуть, хто способен в вс в 6 утра (utc+3) задавать вопросы, и ничего писать не собирался - щас прийдет хтонить более головастый и покажет ошибку, которую я не заметил, я же - спааать, разбираться бум чуть позжее =)


Название: Re: смена активного окна в MDI-приложении
Отправлено: pastor от Июнь 27, 2010, 10:51
Покажи стек вызовов


Название: Re: смена активного окна в MDI-приложении
Отправлено: mokynis от Июнь 27, 2010, 14:35
Цитировать
Покажи стек вызовов
Знать бы еще где его искать :(
В общем, прикладываю все, даже с исполняемым файлом. Собиралось и писалось все в Qt Creator 1.2.1, Qt 4.5.2


Название: Re: смена активного окна в MDI-приложении
Отправлено: sendevent от Июнь 27, 2010, 15:24
Цитата: QAssistant
QMdiSubWindow * QMdiArea::activeSubWindow () const
Returns a pointer to the current active subwindow. If no window is currently active, 0 is returned.
это значит, что везде, где ее используешь, надо проверять полученный указатель:
Код:
void mdi::changeTitle()
{
    QMdiSubWindow *pSubWin = ui->mdiArea->activeSubWindow();
    if( pSubWin )
    {
        this->setWindowTitle(pSubWin->windowTitle());
    }
}


Название: Re: смена активного окна в MDI-приложении
Отправлено: mokynis от Июнь 28, 2010, 08:20
Цитировать
надо проверять полученный указатель
Спасибо, под Windows заработало! Вечером дома на Linux'е проверю, но, наверное, это и есть мой косяк