Russian Qt Forum

Qt => Общие вопросы => Тема начата: Fregloin от Январь 31, 2014, 19:10



Название: QVariant::fromValue сегементация
Отправлено: Fregloin от Январь 31, 2014, 19:10
Столкнулся со странным багом.

Есть модель, в ней описано перечисление

Код:
class CObjectInspectorTreeModel : public QAbstractItemModel, public CUndoStackInterface
{
    Q_OBJECT
public:
    enum            PropertyMode                {pmAll,pmThisOnly,pmDesignableAll,pmDesignableThisOnly};
private:
    PropertyMode    fmode;
public  slots:
void            setMode(PropertyMode Mode);
};

Есть плагин в виде библиотеки DLL.
Ниже код инициализации объекта в плагине
Код:
ObjInspector::ObjInspector(QWidget *parent) :
    QDockWidget(parent),CUndoStackInterface(),
    ui(new Ui::ObjInspector)
{
    ui->setupUi(this);
    setObjectName("object_inspector_dock");
    ftreeModel = new CObjectInspectorTreeModel(this);
    ftreeDelegate = new CObjectInspectorTreeDelegate(this);

    ftreeDelegate->setModel(ftreeModel);
    ui->treeView->setModel(ftreeModel);
    ui->treeView->setItemDelegateForColumn(0,new CReadOnlyDelegate(this));
    ui->treeView->setItemDelegateForColumn(1,ftreeDelegate);

    factions = new QActionGroup(this);
    factions->setExclusive(true);
    QAction *   contextAction;

    contextAction = new QAction(trUtf8("DESIGNABLE свойства"),factions);
    contextAction->setCheckable(true);
    contextAction->setData(QVariant::fromValue(CObjectInspectorTreeModel::pmDesignableAll));
    contextAction->setChecked(true);
    connect(contextAction,SIGNAL(triggered()),this,SLOT(setPropertyMode()));

    contextAction = new QAction(trUtf8("DESIGNABLE свойства только ЭТОГО объекта"),factions);
    contextAction->setCheckable(true);
    contextAction->setData(QVariant::fromValue(CObjectInspectorTreeModel::pmDesignableThisOnly));
    connect(contextAction,SIGNAL(triggered()),this,SLOT(setPropertyMode()));

    contextAction = new QAction(trUtf8("Все свойства"),factions);
    contextAction->setCheckable(true);
    contextAction->setData(QVariant::fromValue(CObjectInspectorTreeModel::pmAll));
    connect(contextAction,SIGNAL(triggered()),this,SLOT(setPropertyMode()));

    contextAction = new QAction(trUtf8("Все свойства только ЭТОГО объекта"),factions);
    contextAction->setCheckable(true);
    contextAction->setData(QVariant::fromValue(CObjectInspectorTreeModel::pmThisOnly));
    connect(contextAction,SIGNAL(triggered()),this,SLOT(setPropertyMode()));

    ui->treeView->addActions(factions->actions());
    ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu);
}

void ObjInspector::setPropertyMode()
{
    QAction *   action = qobject_cast<QAction*>(sender());
    Q_ASSERT(action);
    CObjectInspectorTreeModel::PropertyMode mode = action->data().value<CObjectInspectorTreeModel::PropertyMode>();
    ftreeModel->setMode(mode);
}

Это простой инспектор объектов. Плагин представляет собой ДокВиджет, в котором расчположен QTableView.
Вот для этого tableView нужно создать контекстное меню. Все создается и работает в первый раз после запуска программы.
Но стоит выгрузить плагин, а потом загрузить еще раз, то получаю сегментацию на
Код:
contextAction->setData(QVariant::fromValue(CObjectInspectorTreeModel::pmDesignableAll));

Работало долго и нудно, а сегодня вылез баг и хоть убей не пойму что не так. При отладке залазит далеко вглубь QVariant.


Название: Re: QVariant::fromValue сегементация
Отправлено: Fregloin от Январь 31, 2014, 19:12
PS. Избавился временно от setData путем вызова отдельных слотов, но все равно нужно разобраться почему такой баг.