Eigene Deleagte Klasse vervollständigen (reagiert nicht)

Alles rund um die Programmierung mit Qt
Antworten
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Eigene Deleagte Klasse vervollständigen (reagiert nicht)

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was spricht dagegen die CheckBoxen zu verwenden, die Qt ohne eigenes Delegate verwendet?
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Die Qt::CheckStateRole kennst du aber schon?
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag von Andy2211 »

Hi,
nein, wie genau funktioniert das? Mach ich das als flag?

Gruß,
Andy[/quote]
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Die Flags lassen aber schon ein editieren zu?
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich versteh immer noch nicht, warum du ein eigenes Delegate verwendest, wenn Qt die Funktionalität von haus aus anbietet.
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag 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 :roll:

Gruß,
Andy
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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();
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag von Andy2211 »

Hi,
danke hat mir sehr geholfen! :D
Jetzt gehts auch ohne eigenes delegate.

Gruß,
Andy
Antworten