QT4 Qtableview отключить выбор строк - PullRequest
3 голосов
/ 23 августа 2011

Я использую qtableview-s, чтобы показать некоторые данные из таблиц sqlite.У меня есть 2 таблицы, которые по сути одинаковы.Они оба показывают автобусные остановки (той же модели) в строках.В первой таблице я выбираю вылет, и я хотел бы добиться, чтобы во второй таблице все записи перед выбранной были сделаны не выбираемыми, чтобы пользователь не мог вернуться назад, чтобы выбрать их.Мне удалось скрыть их, используя setRowHidden (row, true) , но я все еще хотел бы их видеть, но не смог их выбрать.

Я пытался использоватьфлаги Qt :: ItemFlags (используя метод flags в пользовательской модели) для строки, но независимо от того, что я использую, строки по-прежнему можно выбирать.Кто-нибудь знает, как отключить строку в QTableView, чтобы она по-прежнему отображалась, но не выбиралась.

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

Спасибо за советы / помощь, но в то же время я нашел решение (хорошо, ошибка в моем коде). Это была ошибка в моей пользовательской модели. Я возвращал неправильные флаги для элемента. Для других, которые могут попытаться сделать что-то подобное. Вы должны реализовать метод flags в пользовательской модели (производной от QSQLQueryModel) и вернуть флаг Qt :: NoItemFlags для элементов, которые вы не хотите выбирать. Я возвращал QAbstractItemModel :: flags (index) , но некоторые флаги по умолчанию уже установлены.

Qt::ItemFlags busStopsTableModel::flags(const QModelIndex &index) const
 {
    if(index.row()>lastDisableRowID){

        return QAbstractItemModel::flags(index)|Qt::ItemIsSelectable;
    }
    else
    {
        return Qt::NoItemFlags;
    }

 }
0 голосов
/ 23 августа 2011

Вы можете установить фильтр событий в QTableView и переопределить события нажатия / перемещения мыши (или создать класс, наследующий QTableView, чтобы делать то же самое).

Код фильтра событий будет выглядеть следующим образом:

Из класса, создающего и использующего QTableView:

QTableView* view = new QTableView(this);
view->installEventFilter(this);

Создайте метод eventFilter для этого же класса:

bool MyClass::eventFilter(QObject* object, QEvent* event)
{
    if(object == view && (event->type() == QEvent::MousePress || event->type() == QEvent::MouseMove)) {
        // if statement to see if event position is on one of the rows you want to disable
            // if true, return true
    }
    return false;
}
0 голосов
/ 23 августа 2011

Извините.Флаги на заказной модели были моей единственной идеей.Я предполагаю, что ваш исходный источник данных - QSQLQueryModel?Вы создали подкласс и переопределили или создали QAbstractProxyModel?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...