crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Ошибка повторного открытия QSWorkbench, QSA QSWorkbench
JohnZ
  опции профиля:
сообщение 31.7.2014, 13:54
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Здравия Всем !

Помогите решить проблему "вылета" арр при повторном открытии QSA QSWorkbench.

Код. Всё "лишнее" убрано, ес-сно ...
class MdiChild : public QTreeView
{
    Q_OBJECT

public:
    MdiChild(QWidget *parent = 0);
    ~MdiChild();

protected:
    void closeEvent(QCloseEvent *event);
    void contextMenuEvent(QContextMenuEvent *event);
    void mouseDoubleClickEvent ( QMouseEvent * event );

private:
    DomModel *model;

//  !!! Трабл начинается тут !!! Т.к. у QSWorkbench НЕТ конструктора по умолчанию,

    QSScript        *qsa_scr;
    QSProject       *qsa_prj;
    QSWorkbench  *qsa_wbh;
};

////////////////////////////////////////////////////////////////////////////////////////

MdiChild::MdiChild(QWidget *parent) : QTreeView(parent)
{
    setAttribute(Qt::WA_DeleteOnClose);

    qsa_prj = new QSProject(this);
    qsa_wbh = new QSWorkbench(qsa_prj, this); // Т.к. у него НЕТ конструктора по умолчанию !!!
}

MdiChild::~MdiChild()
{
    delete  qsa_wbh;
    delete  qsa_prj;
    delete  model;
}

////////////////////////////////////////////////////////////////////

void MdiChild::editAll()
{
    QString fName, sCode;
    QModelIndex index = selectedIndexes().first(); // QItemSelectionModel::
    DomItem *item = static_cast<DomItem*>(index.internalPointer());

    if ((item->Idc >= 60) && (item->Idc <= 69)) // Script-s
    {
        if (item->Idc == 60)    // Global Script-s
        {
            fName = QString("qsglobal.qsa");
            sCode = model->getText(item->node().toElement(), "qsacode");
        }
        else
        {
            fName = QString("scr%1-%2.qsa").arg(item->Idc).arg(item->Idd);
            sCode = QString("// script\n %1").arg(item->node().toElement().text());
        }


        qsa_scr = qsa_prj->createScript(fName, sCode);
        qsa_scr->setCode ( sCode );
        qsa_wbh->showScript(qsa_scr);   //  <- Вот здесь вылетает в ошибку при повторном входе
        qsa_wbh->open();
        return;
    }

    QMessageBox::warning(this, tr("Дизайнер"), tr("Что собрался редактировать ?"));
}


Порядок действий для получения ошибки такой, - выбираем в окне QTreeView скрипт на
редактирование. Открывается QSA QSWorkbench. Можем выбрать другой скрипт, он
добавится в QSWorkbench второй вкладкой. И теперь если закрыть окно QSWorkbench
нажав на крестик в правом углу, а затем выбрать любой скрипт в окне QTreeView на
редактирование, то наблюдается стабильный вылет в отладчик.
Помогите решить сей трабл, плз. Я понимаю, что с логикой напутал, но по-другому
не получается, по причине отсутствия у QSA QSWorkbench конструктора по умолчанию.
Не переписывать-же его ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 31.7.2014, 18:57
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Насколько я понимаю, при закрытии удаляется QSWorkbench? Почему бы тогда не хранить его в родительском виджете?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 1.8.2014, 10:27
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Так точно ! Указатель (и память) QSWorkbench остались, а он сам удалён.
В родительском виджете хранить низзя, по причине MDI, - он (QSWorkbench) принадлежит дочернему окну,
т.е. открытому проекту. В АРР можно открыть несколько проектов, и дрыг\драп между-ними "куски" ...
У каждого проекта свой (отдельный) QSWorkbench !
Т.е. я так понимаю трабл нерешаем, или придётся переписывать QSWorkbench ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 1.8.2014, 19:52
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Можно создавать QSWorkbench в editAll, если он удален. Чтобы последить за ним, можно использовать QPointer http://qt-project.org/doc/qt-4.8/qpointer.html.
Но как то это выглядит костыльно. Можете приложить минимальный проект, побаловаться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 2.8.2014, 12:06
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


До минимального уже далековато, но попробую. Не обещаю это сделать быстро. Мыло есть ?
В принципе, могу и весь слить, судя по ответам в другой ветке, вы видимо сможете оказать
посильную помощь в дальнейшей разработке технологии ... ?!
За основу взяты примеры mdi и simpledommodel из qt 4.5.3, и ес-сно "Ананас". С ним знакомы ?
Собранная либа QSA 1.2.3 есть ? Ведь без неё никак. Компилю из крейтора 1.2.90.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 6.8.2014, 19:12
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Ура ! Заработало !
Вопрос решился правкой исходников QSA !
Добавил я ему
void closeEvent(QCloseEvent *event);
и отправляю сей эвент в игнор :) ес-сно с уведомлением парента.

Вопрос закрыт !!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.1.2021, 15:10