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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QVariant::fromValue сегементация  (Прочитано 1962 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Январь 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.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Январь 31, 2014, 19:12 »

PS. Избавился временно от setData путем вызова отдельных слотов, но все равно нужно разобраться почему такой баг.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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