lte__
lte__

Reputation: 7576

QTableView disable selection of single column

I have a QTableView made from a MySQL query in Qt as follows:

tableView = new QTableView(this);
tableView->setModel(tableModel); 
tableView->setSelectionBehavior(QAbstractItemView::SelectItems); 
tableView->resizeColumnsToContents(); 

Where tableModel is a QSqlTableModel*. I found the solution here to be item->setFlags(item->flags() & ~Qt::ItemIsEditable);, but I'm not adding the data to the table item by item. So what's the solution in this case?

Upvotes: 2

Views: 1971

Answers (1)

Tomas
Tomas

Reputation: 2210

Inherit your own model class from the QSqlTableModel and reimplement the flags() method.

It could be like this:

class CMySqlTableModel : public QSqlTableModel
{
    public:
        CMySqlTableModel(QObject* parent)
            :    QSqlTableModel(parent)
        {}

        /**
         * Enable / disable selection for particular column.
         *
         */
        void setSelectionEnabledOnColumn(int columnIndex, bool enabled)
        {
            if (enabled)
                m_columnsNotSelectable.erase(columnIndex);
            else
                m_columnsNotSelectable.insert(columnIndex);
        }

        Qt::ItemFlags flags(const QModelIndex & index) const override
        {
             Qt::ItemFlags f = QSqlTableModel::flags(index);
             if (m_columnsNotSelectable.find(index.column()) != m_columnsNotSelectable.end())
                 f &= ~Qt::ItemIsSelectable;

             return f;
        }

    private:
        std::set<int> m_columnsNotSelectable;
}

Upvotes: 2

Related Questions