Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Ошибка сегментации при работе с потомками формы.

Автор: mva 20.2.2011, 0:24

Доброго времени суток всем!

Создаю форму с помощью такого кода:

    QFile file(fileName + ".ui");
    if (file.open(QIODevice::ReadOnly)) {
        QUiLoader loader;
        loader.addPluginPath("./plugins/");
        QWidget* widget = loader.load(&file);
        file.close();
        if (QString(widget->metaObject()->className()).compare("QDialog") == 0) {
            formWidget = (QDialog*)widget;
            formWidget->setParent(pwgt);
            formWidget->setVisible(false);
            formWidget->setWindowFlags(Qt::Window | Qt::Dialog | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint);
            ...
        }
        ...
    }


Все объекты на форме оформлены в виде плагинов. Проблема в том, что программа иногда спотыкается по ошибке сегментирования на следующей строчке кода:

grdTable = (TableView*)formWidget->findChild<QTableView*>("tableView"); ,

который ищет объект типа TableView на этой форме. Именно иногда, не всегда.

Что посоветуете сделать в такой ситуации? Может быть что-то в коде загрузки формы подправить? Что можно еще предпринять?



Автор: kwisp 20.2.2011, 9:26

Цитата(mva @ 20.2.2011, 0:24) *
grdTable = (TableView*)formWidget->findChild<QTableView*>("tableView");

с какой целью ты пользуешься Си-подобным приведением типа, если судя по документации к функции findChild должно работать так:
grdTable = formWidget->findChild<TableView*>("tableView");

по идее если обЪект с данным именем не найден то функция вернёт нулевой указатель на тип QTableView а ты его принудительно приводишь к типу TableView* в итоге все равно получить ноль должен.

может стоит добавить проверку : найден ли обЪект с данным именем? а дальше уже разбираться почему программа падает.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)