Qtableview verticalheader show icon instead of numbers
-
Ah, well, that was something you did not specify in your question.
The simple answer is: you can not. The selection state is something that is not a property of the model, but of the view in the Qt model/view setup. So, your model knows nothing of the selection state.To me, that is a reason to use a proxy model here, and give it a setter for a QItemSelectionModel. Then, set the item selection model from your view on your proxy model, and use the item selection model to find out if the current row is selected or not.
-
this is waht you mean ??
for example my proxy model is : mytablemodel
myview is : tableView;i will implement a setter in mytablemodel like so
@QItemSelectionModel SetSelectionModel(QItemSelectionModel *selection) ;@
then in main coeur return the selection
@QItemSelectionModel MytableModel::SetSelectionModel(QItemSelectionModel *selection)
{
return selection;
}
@then get the selectionmdel from the tableView
@tableView->selectionModel() ;@
then
@mytablemdoel->SetSelectionModel(tableView->selectionModel() )@plz check it out
-
No, that's not what I mean. I mean:
@
class MyProxyModel: public QIdentityModel
{
public:
void setSelectionModel(QItemSelectionModel* selection)
{
m_selectionModel = selection;
}QVariant headerData(int section, Qt::Orientation orientation, int role) const;
private:
QItemSelectionModel* m_selectionModel;
};QVariant MyProxyModel::headerData(...)
{
if (m_selectionModel)
{
//use the selection model to figure out if the current row is selected
// if so, return your arrow icon for the decoration role
}return QIdentityProxyModel::headerData(...);
}
//where you create the models and view stuff
MyProxyModel* proxy = new MyProxyModel(myTableView);
proxy->setSourceModel(mySqlModel);
myTableView->setModel(proxy);
proxy->setSelectionModel(myTableView->selectionModel());
@ -
Yes, this what i write in code above
mytablemodel is my proxymodel :)
i don't write the code, i just want to check if it's the idea that you want
finally, thank's for quick answers, complet example :)
regards, abdeu
-
i have implemented the functions but the programme crashed
her is my header file @#include <QSortFilterProxyModel>
#include <QItemSelectionModel>
class MytableModel : public QSortFilterProxyModel
{
public:
explicit MytableModel(QObject parent = 0);
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex &proxyIndex, int role) const;
void SetSelectionModel(QItemSelectionModel selection) ;
private:
QItemSelectionModel *m_selectionModel;};
@myfunction her :
@
void MytableModel::SetSelectionModel(QItemSelectionModel* selection)
{
m_selectionModel = selection ;
}
@her is my main
@
// my main model venteModel
// my proxy model ProxyProduitModel
// my view listProduitTableViewProxyProduitModel->SetSelectionModel(listProduitTableView->selectionModel());
venteModel->setQuery("select *from Produit");
ProxyProduitModel->setSourceModel(venteModel);
listProduitTableView->setModel(ProxyProduitModel);@
-
You'll have to do better than "it crashes". Fire up your debugger when that happens, and figure out what is going wrong from that.
-
i'm not familiare with debugger but, i have try to figure out ,what's the problem, and i get the line where the problem is happned
this @
// Her i get the index(0,0) from proxymodel
QModelIndex index = this->index(0,0) ;
// then i have maked the testif( orientation == Qt::Vertical) if( orientation == Qt::Vertical && Qt::DecorationRole ) // her is the line , the programme crashes her
if(m_selectionModel->isRowSelected(index.row(),index)) ;
return QPixmap("imgs/arrow.png");@ -
Now, the problem is in the index of selected row
i try to get then selected index in view like so, but isn't works
@proxyModel->sourceModel()->index(0,0) ;@
or @proxyModel->index(0,0) ;@i want to know how i get the selected row index, to be able to use it in
@isRowSelected(int row, const QModelIndex & parent)
and
isSelected(const QModelIndex & index)
@ -
Now, it's clear that some thing is wrong with index, but i can't figured out
where is the problemher is my code @
if( orientation == Qt::Vertical)
{
if( role == Qt::DecorationRole )
{
QModelIndexList indexes = m_selectionModel->selection().indexes();
QModelIndex index = m_selectionModel->selection().indexes().at(0);
if(m_selectionModel->isSelected(index))
return QPixmap("imgs/arrow.png");
}
}@ -
Hi,
indexes might be empty, you don't check that case
-
i have checked is the list isempty or no but the same problem
@if( role == Qt::DecorationRole )
{
QModelIndexList IndexsList = m_selectionModel->selection().indexes();
if(!IndexsList.isEmpty())
{
QModelIndex index = m_selectionModel->selection().indexes().at(0);
if(m_selectionModel->isSelected(index))
return QPixmap("imgs/square.png");
}
}
}@ -
this is another code but, unfortunately also not working
@if( role == Qt::DecorationRole )
{
//i have used debugger and, the app crashed when execute the line below
bool indexListOk = m_selectionModel->selection().indexes().isEmpty() ;
if(!indexListOk)
{
QModelIndex index = m_selectionModel->selection().indexes().at(0);
if(m_selectionModel->isSelected(index))
return QPixmap("imgs/square.png");}@
-
Did you set m_selectionModel to something valid ?
If you follow the code from Andre carefully, you'll see that it checks first whether m_selectionModel is not NULL. Which also means that you must set it to NULL in your constructor.
-
Oh! , i forgot to do this , thank's SGaist, andre, i will try to implement this
:) -
Always initializes all your pointers in the constructor either to something valid or NULL like in this case.
And check for NULL for all pointer variables that are initialized to NULL each time you'll be using these variables
-
Yes, the probem caused by non initialisation of m_selectionModel pointer
but still i have a small a problem
when i select a row the icon show up, but when i leave the row (i can't get the icon disappear
@if(m_selectionModel)
{
QModelIndexList indexList = m_selectionModel->selection().indexes();
if(!indexList.isEmpty())
{
QModelIndex index = indexList.at(0);
if(index.isValid() )
return QPixmap("imgs/arrow.png");
}else{
return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole);} }else{ return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole); }
@
-
@Andre: The headerDataChanged() signal doesn't get emitted with this method, correct? Thus the view won't be notified to update the headers when it's meant to?
[quote author="advseo32" date="1375459821"]i'm not familiare with debugger[/quote]Take time to learn. It's a very valuable tool for programmers: http://qt-project.org/doc/qtcreator-2.8/creator-debugging.html
-
[quote author="SGaist" date="1375475299"]Always initializes all your pointers in the constructor either to something valid or NULL like in this case.
And check for NULL for all pointer variables that are initialized to NULL each time you'll be using these variables[/quote]
Ok, i got it now :) -
bq.
[quote author="advseo32" date="1375459821"]i'm not familiare with debugger[/quote]Take time to learn. It's a very valuable tool for programmers: http://qt-project.org/doc/qtcreator-2.8/creator-debugging.html[/quote]thanks JKSH, i will learn how i can use debugger
-
the icon showed randomly in vertical header
her is my code @switch (role) {
case Qt::DecorationRole :
if(m_selectionModel)
{
QModelIndexList indexList = m_selectionModel->selection().indexes();
if(!indexList.isEmpty())
{
QModelIndex index = indexList.at(0);
if(index.isValid() )
{
for (int i=0;i<this->rowCount();++i)
{
if(i == index.row())
return QPixmap("imgs/arrow.png");
else
return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole);
}
}
}else
return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole);}else return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole); break; default: QSortFilterProxyModel::headerData(section,orientation,role); break; }@