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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Отключение стандартных сигналов у виджетов  (Прочитано 7384 раз)
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 ничего не происходило, но ... Она выделяется и в ней можно редактировать выдавшиеся записи (они потом не обновляются правда, но всё равно нужно именно реализовать бездействие по двойному клику).
Записан
Igore
Гость
« Ответ #1 : Февраль 28, 2012, 11:37 »

Для того чтобы нельзя было редактировать из модели не возвращай флаг Qt::ItemIsEditable
Код:
QAbstractItemModel::flags ( const QModelIndex & index ) const

А выделение тебе придется самому обрабатывать, сделай слот на двойной клик в котором будешь снимать выделение, или installEventFilter и как то определить double click, или отнаследоваться от View и переопределить
Код:
void QAbstractItemView::mouseDoubleClickEvent
Записан
bez_glaz
Гость
« Ответ #2 : Февраль 28, 2012, 12:22 »

Для того чтобы нельзя было редактировать из модели не возвращай флаг Qt::ItemIsEditable
Код:
QAbstractItemModel::flags ( const QModelIndex & index ) const

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

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Февраль 28, 2012, 13:33 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Странник
Гость
« Ответ #4 : Февраль 28, 2012, 13:43 »

достаточно флагов Qt::ItemIsSelectable и Qt::ItemIsEditable не возвращать для нужных элементов.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Февраль 28, 2012, 15:00 »

Управлять режимом редактирования можно через:
Код
C++ (Qt)
void QAbstractItemView::setEditTriggers( QAbstractItemView::EditTriggers triggers )
Записан

Qt 5.11/4.8.7 (X11/Win)
bez_glaz
Гость
« Ответ #6 : Февраль 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 ?
Записан
mutineer
Гость
« Ответ #7 : Февраль 28, 2012, 15:27 »

Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

А где ты его заменял?
Записан
bez_glaz
Гость
« Ответ #8 : Февраль 28, 2012, 15:28 »

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

Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

А где ты его заменял?
в mainwindow.cpp
Записан
mutineer
Гость
« Ответ #10 : Февраль 28, 2012, 15:29 »

Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

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

В каком классе ты это менял? Не в QAbstractItemModel же
« Последнее редактирование: Февраль 28, 2012, 15:38 от mutineer » Записан
bez_glaz
Гость
« Ответ #11 : Февраль 28, 2012, 15:38 »

Попробывал заменить на
Код:
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
  return Qt::NoItemFlags;
}
Но результат нулевой, какой синтаксис для НЕ возврата флагов и вообще правильно ли реализовал ?

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

В каком классе ты это менял? Не в QAbstractItemModel же
Всмысле какой класс ?
В классе главного окна, в объекте класса главного окна, если так более понятно, а где ещё вставлять этот кодинг ? Я указал же все пространства имён перед использованием!?
Записан
mutineer
Гость
« Ответ #12 : Февраль 28, 2012, 15:39 »

Возвращать флаги надо из метода flags класса-наследника QAbstractItemModel, экземпляр которого используется в качестве модели
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Февраль 28, 2012, 15:48 »

т.е. тебе нужно отнаследоваться от QSqlTableModel и уже в производном классе перегрузить flags().
Записан

Qt 5.11/4.8.7 (X11/Win)
bez_glaz
Гость
« Ответ #14 : Февраль 28, 2012, 15:51 »

Возвращать флаги надо из метода flags класса-наследника QAbstractItemModel, экземпляр которого используется в качестве модели
Класс наследник QTableView, а экземпляр получается ui->ListObj ? Я правильно понял ?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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