Checkbutton in Listview
Checkbutton in Listview
Hallo,
ich habe eine Listview, die ich mit Inhalt aus meiner DB fülle. Ich brauche allerdings jetzt noch Checkboxen an die einzelnen Einträge damit ich die Einträge auswählen kann, Wie kann man sowas denn machen? Bitte keine helft mir mit konkreten Beschreibungen, da ich in QT/C++ ein Neuling bin.
ich habe eine Listview, die ich mit Inhalt aus meiner DB fülle. Ich brauche allerdings jetzt noch Checkboxen an die einzelnen Einträge damit ich die Einträge auswählen kann, Wie kann man sowas denn machen? Bitte keine helft mir mit konkreten Beschreibungen, da ich in QT/C++ ein Neuling bin.
Re: Checkbutton in Listview
Eine ListView? Dann hast du irgend ein "QAbstractItemModel".. in diesem Fall musst du also:
1. Zusätzlich flags() überladen und zu den Default-Flags auch noch "Qt::ItemIsUserCheckable" zurückliefern.
Dann weiss die ListView, dass du Checkboxen haben möchtest..
2. Bei der data()-Methode musst du weiter neben der DisplayRole auch noch die "Qt::CheckStateRole" beachten und was passendes zurückliefern (die zum Index gehörende Qt::CheckState)
Jetzt weiss die ListView, welchen Zustand die gerenderte CheckBox hat.
3. Bei der setData()-Methode musst du die "CheckStateRole" ebenfalls beachten (die neue CheckState im Model für die spätere Anwendung (u.a. für die data()-Methode) speichern).
IMHO wär's das..
hth
1. Zusätzlich flags() überladen und zu den Default-Flags auch noch "Qt::ItemIsUserCheckable" zurückliefern.
Dann weiss die ListView, dass du Checkboxen haben möchtest..
2. Bei der data()-Methode musst du weiter neben der DisplayRole auch noch die "Qt::CheckStateRole" beachten und was passendes zurückliefern (die zum Index gehörende Qt::CheckState)
Jetzt weiss die ListView, welchen Zustand die gerenderte CheckBox hat.
3. Bei der setData()-Methode musst du die "CheckStateRole" ebenfalls beachten (die neue CheckState im Model für die spätere Anwendung (u.a. für die data()-Methode) speichern).
IMHO wär's das..
hth
Re: Checkbutton in Listview
Ersteinmal vielen Dank für deine Antwort.
Leider versteh ich nur die Hälfte. Sorry.
Ich nutze momentan eine QListView, diese verbinde ich mit der Methode auswahl_Element um zu prüfen welches angeklickt wurde, somit kann ich ja aber nur eins selectieren.
Was soll denn dann in der flags() methode drin stehen? Für was und an welcher stelle muss ich das überschreiben?
Auch bei Punkt zwei und drei weiß ich nicht was zu tun ist.
Leider versteh ich nur die Hälfte. Sorry.
Ich nutze momentan eine QListView, diese verbinde ich mit der Methode auswahl_Element um zu prüfen welches angeklickt wurde, somit kann ich ja aber nur eins selectieren.
Code: Alles auswählen
connect(this->ui->listView_element,SIGNAL(clicked(const QModelIndex &)),this,SLOT(auswahl_Element(const QModelIndex &)));
Auch bei Punkt zwei und drei weiß ich nicht was zu tun ist.
Re: Checkbutton in Listview
Du solltest Dir mal das Thema Model/View Programming in der Dokumentation ansehen.
Re: Checkbutton in Listview
QListView zeigt Daten an, die ein Model liefert. Dieses model hast du irgendwo per setModel() der view zugewiesen. Und genau dieses Model muss such auf die von solarix beschriebene Weise um Checkbarkeit und CheckState kümmern. Seine Punkte sind demnach im Model umzusetzen.
Was für ein Model verwendest du denn?
Was für ein Model verwendest du denn?
Re: Checkbutton in Listview
Ich benutze QStringListModels
Re: Checkbutton in Listview
Ich habe jetzt folgendes versucht:
Ich habe mir eine eigene Modelklasse gebastelt --> MyListModel
MyListModel.h
MyListModel.cpp
jetzt bekomme ich aber die fehlermeldung: In constructor 'MyListModdel::MyListModel(QObject*)': type QAbstractListModel is not a direct base of MyListModel
Was ist denn da falsch?
Ich habe mir eine eigene Modelklasse gebastelt --> MyListModel
MyListModel.h
Code: Alles auswählen
#ifndef MYLISTMODEL_H
#define MYLISTMODEL_H
#include <QAbstractListModel>
class MyListModel
{
Q_OBJECT
public:
MyListModel(QObject *parent);
int rowCount(const QModelIndex &parent = QModelIndex()) const ;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
};
#endif // MYLISTMODEL_H
Code: Alles auswählen
#include "mylistmodel.h"
#include <QAbstractListModel>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QDebug>
MyListModel::MyListModel(QObject *parent)
:QAbstractListModel(parent)
{
}
int MyListModel::rowCount(const QModelIndex & /*parent */) const
{
return 10;
}
QVariant MyListModel::data(const QModelIndex &index, int role) const
{
switch(role){
case Qt::DisplayRole:
return index.row().toString();
break;
case Qt::FontRole:
break;
case Qt::BackgroundRole:
break;
case Qt::TextAlignmentRole:
return Qt::AlignLeft;
break;
case Qt::CheckStateRole:
return Qt::Unchecked;
}
return QVariant();
}
Was ist denn da falsch?
Re: Checkbutton in Listview
Ok ich habs gefunden --> im Header fehlte:
Code: Alles auswählen
class MyListModel: public QAbstractListModel
Re: Checkbutton in Listview
So jetzt bin ich schon etwas weiter glaub ich
ich habe jetzt die Flags Methode, die Data Methode und die SetData Methode so überschrieben:
Frage ist das erstmal so correct? Wenn nein, wie muss es dann? Und wie kann ich dann jetzt die Box auf checked setzen? Ich denke mal man muss das QVariant verändern, aber ich weiß nicht wie.
Bitte helft mir so kurz vorm Ziel
ich habe jetzt die Flags Methode, die Data Methode und die SetData Methode so überschrieben:
Code: Alles auswählen
QVariant MyListModel::data(const QModelIndex &index, int role) const
{
switch(role){
case Qt::DisplayRole:
return QString("%1").arg(this->stringList.at(index.row()));
break;
case Qt::TextAlignmentRole:
return Qt::AlignLeft;
break;
case Qt::CheckStateRole:
return Qt::Unchecked;
}
return QVariant();
}
Qt::ItemFlags MyListModel::flags(const QModelIndex &index) const
{
if (!index.isValid()){
return Qt::ItemIsEnabled;
}
return QAbstractItemModel::flags(index) | Qt::ItemIsUserCheckable;
}
bool MyListModel::setData(const QModelIndex &index,const QVariant &value, int role){
if(index.isValid() && role == Qt::CheckStateRole){
qDebug()<<"etwas verändert";
return true;
}
return false;
}
Bitte helft mir so kurz vorm Ziel
Re: Checkbutton in Listview
Naja.. eine gute Idee wäre es, den CheckState nicht hardcodiert zurückzugeben, sondern halt aus einem Zwischenpuffer:
Auf den Rest (mit der setData()-Methode) wirst du jetzt noch kommen.. oder?
Code: Alles auswählen
QVariant MyListModel::data(const QModelIndex &index, int role) const
{
switch(role){
case Qt::DisplayRole:
return this->stringList.at(index.row());
...
case Qt::CheckStateRole:
return this->checkStateList.at(index.row()));
}
Re: Checkbutton in Listview
nee da passiert nichts
hier nochmal mein code:
hier nochmal mein code:
Code: Alles auswählen
bool MyListModel::setData(const QModelIndex &index,const QVariant &value, int role){
if(index.isValid() && role == Qt::CheckStateRole){
if(this->stateList.at(index.row())){
this->stateList[index.row()] = false;
return true;
}
else{
this->stateList[index.row()] = true;
return true;
}
}else{
return false;
}
}
Re: Checkbutton in Listview
Deine flags() Methode ist zum Editieren unvollständig, probiers damit:
Code: Alles auswählen
Qt::ItemFlags MyListModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags Flags = QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsUserCheckable;
}
Re: Checkbutton in Listview
Noch ein Tip, in value ist der Zustand der CheckBox enthalten:
Code: Alles auswählen
bool MyListModel::setData(const QModelIndex &index,const QVariant &value, int role)
{
if (index.isValid() && role == Qt::CheckStateRole)
{
if (value.toInt() == Qt::Checked)
stateList[index.row()] = true;
else
stateList[index.row()] = false;
return true;
}
else
{
return false;
}
}