Qtableview verticalheader show icon instead of numbers
-
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; }@
-
[quote author="JKSH" date="1375487264"]@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]
The point of my answer was not to provide a complete, ready to use solution, but give a pointer in the right direction. Emitting the changed signal was considered as an excersise for the reader, as was properly initializing the pointer to the selection model. The code I showed was just typed in quickly directly in the forum editor...
-
i have emitted a signal to inform changes in vertical header but it won't
compileand show me this error @E:\apprendreQt\gestionstock5\mytablemodel.cpp:54: erreur : passing 'const MytableModel' as 'this' argument of 'void QAbstractItemModel::headerDataChanged(Qt::Orientation, int, int)' discards qualifiers [-fpermissive]@
@if(m_selectionModel)
{QModelIndexList indexList = m_selectionModel->selection().indexes(); if(!indexList.isEmpty()) { QModelIndex index = indexList.at(0); if(index.isValid() ) { emit headerDataChanged(Qt::Vertical,0,this->rowCount()-1); return QPixmap("imgs/arrow.png"); } }else return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole); }else return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole);@
-
Because you can't emit a signal from a const function
-
[quote author="SGaist" date="1375558375"]Because you can't emit a signal from a const function[/quote]
I don't know about this, thank's, but really i haven't an idea on
where i will place this emit -
i have tried many ways to infrome view that the data is changed
with out any success@void MytableModel::SetSelectionModel(QItemSelectionModel* selection)
{
m_selectionModel = selection ;
emit headerDataChanged(Qt::Vertical,0,this->rowCount()-1);
}
@i can't emit signal in const functions !! where i can emit that signal ?
-
Well, you want that arrow showed when you select a row, right ? In that case you need to detect that a selection has been made/changed, then tell the world that your header data has changed.
-
[quote author="SGaist" date="1375652135"]Well, you want that arrow showed when you select a row, right ? In that case you need to detect that a selection has been made/changed, then tell the world that your header data has changed.[/quote]
Yes,
i have use this in my main and still not working, i don't know if is the correct place @ connect(listProduitTableView->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),listProduitTableView->verticalHeader(),
SLOT(headerDataChanged(Qt::Vertical,int,int)));@ -
You can't connect two signals with different signatures like that. When starting the application you should have seen an error about that on the console.
Please read the Signals and Slots chapter in Qt's documentation.
-
[quote author="SGaist" date="1375653308"]You can't connect two signals with different signatures like that. When starting the application you should have seen an error about that on the console.
Please read the Signals and Slots chapter in Qt's documentation.[/quote]
Yeah! the console show me an error,i don't know what the signature , it's the parameters ???
if yes , how i can connect Signal selectionChanged() with cheaderDataChanged()i tried to get this work, but it won't work for me , i miss many many concepts in model/view programming
@ connect(listProduitTableView->selectionModel(),SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),listProduitTableView->verticalHeader(),SLOT(dataChanged(QModelIndex,QModelIndex)));
@or maybe my implement is wrong, plz check it out
her is the header file of custommodel
@#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;};@
her is the cpp file of custommodel@#include "mytablemodel.h"
#include <QPixmap>
MytableModel::MytableModel(QObject *parent) : QSortFilterProxyModel(parent){
m_selectionModel = 0;}
QVariant MytableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
switch (orientation) {
case Qt::Horizontal :
switch (role) {
case Qt::DisplayRole :
switch (section) {
case 0: return "Id";break;
case 1: return "Reference";break;
case 2: return "Designation";break;
case 3: return "localisation";break;
case 4: return "Famille";break;
case 5: return "Qte min";break;
case 6: return "Qte max";break;
case 7: return "Qte disponible";break;
case 8: return "Unité";break;
case 9: return "Prix achat";break;
case 10: return "Prix vente";break;
default:
return QString("Column %1").arg(section + 1);
break;} break; default: QSortFilterProxyModel::headerData(section,orientation,role); break; } break; case Qt::Vertical : 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() ) { return QPixmap("imgs/arrow.png"); } }else return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole); }else return QSortFilterProxyModel::headerData(section,Qt::Vertical,Qt::DecorationRole); break; default: return QSortFilterProxyModel::headerData(section,orientation,role); break; } break; default: return QSortFilterProxyModel::headerData(section,orientation,role); break; } return QVariant();
}
QVariant MytableModel::data(const QModelIndex &proxyIndex, int role) const
{
if(role == Qt::TextAlignmentRole)
return Qt::AlignCenter;
else if (role == Qt::DisplayRole)
return QSortFilterProxyModel::data(proxyIndex , role);return QVariant();
}
void MytableModel::SetSelectionModel(QItemSelectionModel* selection)
{
m_selectionModel = selection ;
}
@
@@ -
The signature of a function consists of the return type, the parameter types and constness of the function. You're expected to do your own debugging though.