Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: bez_glaz от Февраль 28, 2012, 10:49



Название: Отключение стандартных сигналов у виджетов
Отправлено: bez_glaz от Февраль 28, 2012, 10:49
Добрый день.
В конструкторе формы прописываю
Код:
disconnect(ui->ListObj,SIGNAL(doubleClicked(QModelIndex)));
где ListObj - QTableView. В QTableView реализую
Код:
modelObj = new QSqlTableModel();
    modelObj->setTable("list_obj");
    modelObj->setEditStrategy(QSqlTableModel::OnFieldChange);
    modelObj->select();
    modelObj->setHeaderData(0, Qt::Horizontal, QString::fromUtf8("Название объекта"));
    modelObj->setHeaderData(1, Qt::Horizontal, QString::fromUtf8("Индикация"));
    modelObj->setHeaderData(2, Qt::Horizontal, QString::fromUtf8("Картиночка"));
    ui->ListObj->setModel(modelObj);
В итоге хочу чтоб по двойному нажатию на любую ячейку в QTableView ничего не происходило, но ... Она выделяется и в ней можно редактировать выдавшиеся записи (они потом не обновляются правда, но всё равно нужно именно реализовать бездействие по двойному клику).


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: Igore от Февраль 28, 2012, 11:37
Для того чтобы нельзя было редактировать из модели не возвращай флаг Qt::ItemIsEditable
Код:
QAbstractItemModel::flags ( const QModelIndex & index ) const

А выделение тебе придется самому обрабатывать, сделай слот на двойной клик в котором будешь снимать выделение, или installEventFilter и как то определить double click, или отнаследоваться от View и переопределить
Код:
void QAbstractItemView::mouseDoubleClickEvent


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: bez_glaz от Февраль 28, 2012, 12:22
Для того чтобы нельзя было редактировать из модели не возвращай флаг Qt::ItemIsEditable
Код:
QAbstractItemModel::flags ( const QModelIndex & index ) const

А выделение тебе придется самому обрабатывать, сделай слот на двойной клик в котором будешь снимать выделение, или installEventFilter и как то определить double click, или отнаследоваться от View и переопределить
Код:
void QAbstractItemView::mouseDoubleClickEvent
Редактрование из модели вообще не трогаем, т.к. если уберём обработку дабл клика, то и редактирования не будит.
Если я создам сигнал, который будит по двойному клику снимать выделение, как будит системно перекрываться дефолтный сигнал ?
И вообще у меня возник такой вопрос, реализация связи двойной клик - редактирование TableView это слот сигналый коннект, который прописан где-то по умолчанию или же что-то другое  ?


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: kambala от Февраль 28, 2012, 13:33
Для того чтобы нельзя было редактировать из модели не возвращай флаг Qt::ItemIsEditable
Код:
QAbstractItemModel::flags ( const QModelIndex & index ) const
это - правильный подход, а не отключение сигналов.
И вообще у меня возник такой вопрос, реализация связи двойной клик - редактирование TableView это слот сигналый коннект, который прописан где-то по умолчанию или же что-то другое  ?
в QTableView реализован и действие зависит от возможности редактирования модели


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: Странник от Февраль 28, 2012, 13:43
достаточно флагов Qt::ItemIsSelectable и Qt::ItemIsEditable не возвращать для нужных элементов.


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: GreatSnake от Февраль 28, 2012, 15:00
Управлять режимом редактирования можно через:
Код
C++ (Qt)
void QAbstractItemView::setEditTriggers( QAbstractItemView::EditTriggers triggers )


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: bez_glaz от Февраль 28, 2012, 15:21
В Qt ещё не силён, пока остановимся на флагах.
Порылся тут на форуме нашёл
Код:
Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
 if(index.row()==0)
  return ItemIsEnabled;
 else
  return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

Ещё нашёл по флагам что-то типо
Код:
setWindowFlags(Qt::WindowMinimizeButtonHint);
убирает стандартные элементы на верхней панельки формы. Прописывал прямо в конструкторе, может быть есть на подобее функции и для ItemFlags ?


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: mutineer от Февраль 28, 2012, 15:27
Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

А где ты его заменял?


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: bez_glaz от Февраль 28, 2012, 15:28
Управлять режимом редактирования можно через:
Код
C++ (Qt)
void QAbstractItemView::setEditTriggers( QAbstractItemView::EditTriggers triggers )
Спасибо=)
Тригеры оказались полегче =)
Код:
ui->ListObj->setEditTriggers(QAbstractItemView::NoEditTriggers);
и как бы всё )
но насчёт флагов хотелось бы уточнить, всё таки полезно и второй метод знать!


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: bez_glaz от Февраль 28, 2012, 15:28
Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

А где ты его заменял?
в mainwindow.cpp


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: mutineer от Февраль 28, 2012, 15:29
Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

А где ты его заменял?
в mainwindow.cpp

В каком классе ты это менял? Не в QAbstractItemModel же


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: bez_glaz от Февраль 28, 2012, 15:38
Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

А где ты его заменял?
в mainwindow.cpp

В каком классе ты это менял? Не в QAbstractItemModel же
Всмысле какой класс ?
В классе главного окна, в объекте класса главного окна, если так более понятно, а где ещё вставлять этот кодинг ? Я указал же все пространства имён перед использованием!?


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: mutineer от Февраль 28, 2012, 15:39
Возвращать флаги надо из метода flags класса-наследника QAbstractItemModel, экземпляр которого используется в качестве модели


Название: Re: Отключение стандартных сигналов у виджетов
Отправлено: GreatSnake от Февраль 28, 2012, 15:48
т.е. тебе нужно отнаследоваться от QSqlTableModel и уже в производном классе перегрузить flags().


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: bez_glaz от Февраль 28, 2012, 15:51
Возвращать флаги надо из метода flags класса-наследника QAbstractItemModel, экземпляр которого используется в качестве модели
Класс наследник QTableView, а экземпляр получается ui->ListObj ? Я правильно понял ?


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: bez_glaz от Февраль 28, 2012, 15:57
т.е. тебе нужно отнаследоваться от QSqlTableModel и уже в производном классе перегрузить flags().
И снова спасибо =)
Код:
Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Таблица правда стала вообще не доступно, что-то типо Enable = 0. Хотелось бы теперь узнать как убрать флаги из набора уже имеющихся? Ну тупо сам синтаксис. Допустим Qt::ItemIsEditable флаг убрать.


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: mutineer от Февраль 28, 2012, 15:58
Возвращать флаги надо из метода flags класса-наследника QAbstractItemModel, экземпляр которого используется в качестве модели
Класс наследник QTableView, а экземпляр получается ui->ListObj ? Я правильно понял ?
Неправильно


Название: Re: Отключение стандартных сигналов у видже&#
Отправлено: bez_glaz от Февраль 28, 2012, 15:59
Возвращать флаги надо из метода flags класса-наследника QAbstractItemModel, экземпляр которого используется в качестве модели
Класс наследник QTableView, а экземпляр получается ui->ListObj ? Я правильно понял ?
Неправильно
Ну да уже понял :)