Unsolved Show a context menu when the a column in a QTableView is selected
-
Hello, as the title says I am trying to implement a context menu that appears on left click if a whole column is selected in a TableView.
In my MainWindow I have these attributes
private: QString mFilePath; DatasetModel model; myTabView* view; DataFrame data; TabSelModel* selModel;
where
myTabView
is just a reimplementedQTableView
. I installed an event filter in the constructor of the MainWindow like thisview->installEventFilter(this);
and I implemented dieventfilter
in the Main Window like thisbool MainWindow::eventFilter(QObject *watched, QEvent *e) { if(watched==view && e->type()==QEvent::MouseButtonPress) { QModelIndexList idxl = view->selectedIndexes(); QMouseEvent *mou = static_cast<QMouseEvent*>(e); if(mou->button()==Qt::RightButton && selModel->ColSelected.first) { ShowContextMenu(mou->pos()); return true; } } return QWidget::eventFilter(watched,e); }
Where
ColSelected
is aQPair
implemented in a slot of myTabSelModel
(a reimplementedQItemSelectionModel
). The slot looks like thisvoid TabSelModel::CheckSelection(const QModelIndex& mod,) { qDebug() << "Inside mod.column=" << mod.column(); if(isColumnSelected(mod.column(),mod)) //never evaluates to true ColSelected = qMakePair(true,mod); else ColSelected.first = false; }
which is connected to a simple
SIGNAL(currentChanged())
from the selection model. I manage to get into the slot (theqDebug
outputs the correct column) but the first condition never evaluates to true. How is that possible? -
isColumnSelected
checks for selection in the parent given in second param, so this should rather be
if(isColumnSelected(mod.column(),mod->parent()))
. -
I changed the code but still I never reach
ColSelected = qMakePair(true,mod);
. -
Maybe a silly question, but is the whole column actually selected ? If you get selected items in that slot does that contain all indices in the column?
-
Actually I get all the rows but I get the previously selected column. The code is
void TabSelModel::CheckSelection(const QModelIndex& mod) { qDebug() << "Inside mod.column=" << mod.column(); QModelIndexList ls = selectedIndexes(); foreach(QModelIndex i, ls) qDebug() << i.column() << "," << i.row();
And the first time I select the first column of the table the output is just
Inside mod.column= 0
When I select the next column I get
Inside mod.column= 1 0 , 0 0 , 1 0 , 2 0 , 3 ... 0, 66
How is that possible?
-
Most things in c++ are indexed from 0, so first column has index 0, second 1 and so on.
-
I know, what is strange is that
mod.column()
evaluates to 1 andselectedIndexes()[0].column()
evaluates to 0 while they should be the same. -
May it be related to some sort of dragging of the previous selection?