Seite 1 von 1
Eigene Deleagte Klasse vervollständigen (reagiert nicht)
Verfasst: 14. November 2008 12:37
von Andy2211
Hallo alle zusammen,
habe für eine Tree View ein Delegate geschrieben, was anstalle eines normalen labels eine checkbox printet.
Was muss ich noch machen, damit die Checkbox ansprechbar wird? Kann sie nicht anklicken, auf events wie hover oder so reagiert es auch nicht.
Gruß,
Andreas
Verfasst: 14. November 2008 20:12
von upsala
Was spricht dagegen die CheckBoxen zu verwenden, die Qt ohne eigenes Delegate verwendet?
Verfasst: 14. November 2008 20:42
von Andy2211
Hi,
was genau meinst du ohne eigenes Delegate?
Gibts einen "Schalter" den ich übersehen hab bei der TreeView?
Oder meinst du Checkboxen ins Datenmodell einbauen?
Gruß,
Andy
Verfasst: 14. November 2008 20:54
von upsala
Die Qt::CheckStateRole kennst du aber schon?
Verfasst: 14. November 2008 21:27
von Andy2211
Hi,
nein, wie genau funktioniert das? Mach ich das als flag?
Gruß,
Andy[/quote]
Verfasst: 17. November 2008 18:44
von Andy2211
Hallo,
also ich habs jetzt über data() hinbekommen, über die checkstate role den status zu übergeben. Was genau muss ich aber noch machen, dass ich die CheckBox überhaupt anklicken kann? Auf das Signal clicked(model index) von der TreeView reagiert er nicht?
Bin für alle guten Ratschläge dankbar.
Gruß,
Andy
Verfasst: 17. November 2008 20:47
von upsala
Die Flags lassen aber schon ein editieren zu?
Verfasst: 17. November 2008 21:37
von Andy2211
Hi, das hier sind meine Flags:
Code: Alles auswählen
QStyle::State_On | QStyle::State_Enabled | Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable
Hab einfach mal radikal alles genommen was es hätte sein können.
So sieht momentan die data() funktion aus:
Code: Alles auswählen
QVariant TreeModel::data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();
if(role == Qt::CheckStateRole){
return QVariant(QStyle::State_On | QStyle::State_Enabled | Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
}
if (role != Qt::DisplayRole)
return QVariant();
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
return item->data(index.column());
}
Und so die pain() von dem delegate:
Code: Alles auswählen
void TreeDeleagate::paint( QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index ) const{
QStyleOptionButton styles;
styles.rect = option.rect; //get copy rect option from option
styles.text = index.data(Qt::DisplayRole).toString(); //get text from tree model
styles.state = (QStyle::State) index.data(Qt::CheckStateRole).toUInt();
painter->save();
QApplication::style()->drawControl(QStyle::CE_CheckBox, &styles, painter);//draw checkbox item
painter->restore();
}
Gruß,
Andy
Verfasst: 17. November 2008 21:48
von upsala
Ich versteh immer noch nicht, warum du ein eigenes Delegate verwendest, wenn Qt die Funktionalität von haus aus anbietet.
Verfasst: 17. November 2008 22:03
von Andy2211
Hallo,
ja, wie genau wird das "von Haus aus" gemacht? Das mit dem delegate leuchtet mir ein. Aber wo kann ich ihm ohne das delegate eine CheckBox geben?
Nur ein kleiner Hinweis oder so
Gruß,
Andy
Verfasst: 17. November 2008 22:11
von upsala
Code: Alles auswählen
QTableWidget *wdg=new QTableWidget(5, 2);
for (int i=0; i<3; i++) {
QTableWidgetItem *item=new QTableWidgetItem("Test");
item->setCheckState((Qt::CheckState)i);
wdg->setItem(i, 0, item);
}
wdg->show();
Verfasst: 18. November 2008 15:23
von Andy2211
Hi,
danke hat mir sehr geholfen!
Jetzt gehts auch ohne eigenes delegate.
Gruß,
Andy