Russian Qt Forum
Ноябрь 23, 2024, 14:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: смена активного окна в MDI-приложении  (Прочитано 6129 раз)
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« : Июнь 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);
}
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
sendevent
Гость
« Ответ #1 : Июнь 27, 2010, 06:09 »

либо с приведенными кусками кода все норм, либо мне совсем пора спать. наверно, надо глянуть в неурезанные исходники, а пока расскажи, откудова определил, что проблема именно в childw::slotLoad, а не в том же mdi::slotLoad (всмысле, createNewDoc стопудова возвращает валидный указатель? стопудова-стопудова? а если найду?) и што происходит внутри childw::changeTitle. (вызывает подозрение строка
Код:
connect(ui->mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(changeTitle()));
- аргументы сигнала/слота не совпадают, точно не пытаешься читать по "несуществующему" указателю?)
вообще же, я залез сюда просто глянуть, хто способен в вс в 6 утра (utc+3) задавать вопросы, и ничего писать не собирался - щас прийдет хтонить более головастый и покажет ошибку, которую я не заметил, я же - спааать, разбираться бум чуть позжее =)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Июнь 27, 2010, 10:51 »

Покажи стек вызовов
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #3 : Июнь 27, 2010, 14:35 »

Цитировать
Покажи стек вызовов
Знать бы еще где его искать Грустный
В общем, прикладываю все, даже с исполняемым файлом. Собиралось и писалось все в Qt Creator 1.2.1, Qt 4.5.2
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
sendevent
Гость
« Ответ #4 : Июнь 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());
    }
}
Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #5 : Июнь 28, 2010, 08:20 »

Цитировать
надо проверять полученный указатель
Спасибо, под Windows заработало! Вечером дома на Linux'е проверю, но, наверное, это и есть мой косяк
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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