QTableView Drag and Drop

Alles rund um die Programmierung mit Qt
Antworten
reuabreliz
Beiträge: 86
Registriert: 4. Oktober 2008 17:06

QTableView Drag and Drop

Beitrag von reuabreliz »

Also ich habe eine Tabelle. Mit einem Model. (Model selber abgeleitet von QAbstractTableModel) Funktioniert super. Also das ganze dient dazu Prüfungen aufzulisten. Also spalten sind dan prüflingsname, prüfername, usw. Nun will ich dass man die Prüfungen mit einer Drag und Drop Funktion reihen kann. Wie kann man eine ganze Zeile also alle Spalten aus dieser Zeile, drag und dropen. Habe noch nie so eine Funktion geschrieben, also bitte um Nachsicht. Also das Drag und Droppen von einzelnen Items geht aber eine ganze Zeile, weiß ich nicht wie ich das machen soll. Könnte mir da bitte wer helfen?
reuabreliz
Beiträge: 86
Registriert: 4. Oktober 2008 17:06

Beitrag von reuabreliz »

Ok Problem gelöst. sorry hätte ich nicht posten müssen. Aber bei mir überschreibt es die anderen zeilen wenn ich drag und droppe. Wie kann ich einfach eine Zeile zwischen zwei andere schieben ohne eine zu überschreiben?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nachdem du deinen unbekannten Code selbst geschrieben hast, würde ich das überschreiben durch ein einfügen ersetzen...
reuabreliz
Beiträge: 86
Registriert: 4. Oktober 2008 17:06

Beitrag von reuabreliz »

Code: Alles auswählen

 Qt::DropActions MyTableModel::supportedDropActions() const
 {
     return Qt::CopyAction;
 }
Das ist meine DropAction in meinem Model.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Hiermit überreiche ich dir den 1. Preis für den kürzesten Code für ein von QAbstractTableModel abgeleitetes Model.
reuabreliz
Beiträge: 86
Registriert: 4. Oktober 2008 17:06

Beitrag von reuabreliz »

Danke, aber das ist nicht das ganze Model. das ist nur die Funktion für die Drag Funktion.

das ist das ganze Model. Mit dem wirst du aber nicht viel anfangen können.

myTableModel.h

Code: Alles auswählen

#ifndef _MYTABLEMODEL_
#define _MYTABLEMODEL_

#include <QAbstractTableModel>
#include <QList>

#include "myPruefungenList.h"

class MyTableModel : public QAbstractTableModel
{
	public:     
		MyTableModel(MyPruefungenList *pruefungen,QList<QString> headerdata, QObject *parent = 0); 
    		void setPruefungen(MyPruefungenList *pruefungen); 
    		int rowCount(const QModelIndex &parent) const; //Gibt die Zeilenzahl der Tabelle zurück
		int columnCount(const QModelIndex &parent) const; //Gibt die Spaltenzahl der Tabelle zurück
    		QVariant data(const QModelIndex &index, int role) const; //Das Herzstück der Tabelle 
 	   	QVariant headerData(int section, Qt::Orientation orientation,int role) const; //Setzt die Headerdatein einer Tabelle
		bool setData(const QModelIndex &index, const QVariant &value, int role); //Wird aufgerufen wenn etwas in der Tabelle verändert wurde und setzt sie dann neu
		Qt::ItemFlags flags(const QModelIndex &index) const ; //Setzt die Berechtigungen für jedes Element (z.b.: Editierbar, nichtEditierbar, ...)
		bool insertRows( int row = 0, int count = 0, const QModelIndex & parent = QModelIndex());
		Qt::DropActions supportedDropActions() const; //Drag und Drop Funktion


		MyPruefungenList * getPruefungen();
	private:
 
   		MyPruefungenList *myPruefungen;

		QList<int> vheaderdata;
		QList<QString> hheaderdata;
};
#endif

Code: Alles auswählen

#include "myTableModel.h"
#include <QtDebug>


MyTableModel::MyTableModel(MyPruefungenList *pruefungen,QList<QString> headerdata, QObject *parent) : QAbstractTableModel(parent) 
{
	this->hheaderdata = headerdata;
	myPruefungen = pruefungen; 

	for(int i = 1; i < myPruefungen->getPruefungenList().size(); i++)
	{
		vheaderdata << i;
	}
}

int MyTableModel::rowCount(const QModelIndex & /* parent */) const //Gibt die Zeilenanzahl zurück
{ 
    return myPruefungen->getPruefungenList().count(); 
} 

int MyTableModel::columnCount(const QModelIndex & /* parent */) const //Gibt die Spaltenanzahl zurück
{ 
    return hheaderdata.count(); 
}

QVariant MyTableModel::data(const QModelIndex &index, int role) const
{ 
	QList<MyPruefungen> pruefungenList = myPruefungen->getPruefungenList();
    if (!index.isValid()) 
        return QVariant(); 

    if (role == Qt::TextAlignmentRole)
    { 
        return int(Qt::AlignRight | Qt::AlignVCenter); 
    }
    else if (role == Qt::DisplayRole)
    { 
        switch(index.column())
		{
		case 0:
			if(pruefungenList[index.row()].getPArt() != NULL)
				return pruefungenList[index.row()].getPArt();
			break;
   		case 1:	
			if(pruefungenList[index.row()].getSchueler()->getNName() != NULL)
				return pruefungenList[index.row()].getSchueler()->getNName();
 			break;
		case 2:
			if(pruefungenList[index.row()].getLehrer1()->getNName() != NULL)
				return pruefungenList[index.row()].getLehrer1()->getNName();
			break;
		case 3:
			if(pruefungenList[index.row()].getFach1()->getKBezeichnung() != NULL)
				return pruefungenList[index.row()].getFach1()->getKBezeichnung();
			break;
		case 4:			
			if(pruefungenList[index.row()].getPDatum().isValid())
				return pruefungenList[index.row()].getPDatum().toString("yyyy.MM.dd");
			break;
		case 5:
			if(pruefungenList[index.row()].getPNote())
			{
				QVariant note = pruefungenList[index.row()].getPNote();
				return note.toString();
			}
		}
    } 
    return QVariant(); 
}

QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const 
{ 
	if (orientation == Qt::Horizontal) 
	{
		if (role == Qt::DisplayRole) 
		{
			if(hheaderdata.size() > section)
				return hheaderdata.at(section);
		}

  	}
	else
	{
		if (role == Qt::DisplayRole) 
		{
			if(vheaderdata.size() > section)
				return vheaderdata.at(section);
    		}
	}
	return QAbstractTableModel::headerData(section, orientation, role); //Zur Absicherung default aufrufen
}


bool MyTableModel::setData(const QModelIndex & index, const QVariant& value, int role)
{
	QList<MyPruefungen> pruefungenList = myPruefungen->getPruefungenList();

  if (index.isValid() && (role == Qt::EditRole || role == Qt::DisplayRole) && value.toString() != NULL)
  {
    switch(index.column())
    {
	case 0:
			pruefungenList[index.row()].setPArt(value.toString());	
		break;
	case 1:
			pruefungenList[index.row()].getSchueler()->setNName(value.toString());
		break;
	case 2:
			pruefungenList[index.row()].getLehrer1()->setNName(value.toString());
		break;
	case 3:
			pruefungenList[index.row()].getFach1()->setKBezeichnung(value.toString());
		break;
	case 4:
			pruefungenList[index.row()].setPDatum(value.toDate());
		break;
	case 5:
			pruefungenList[index.row()].setPNote(value.toInt());
		break;
    }
	myPruefungen->setPruefungenList(pruefungenList);
	myPruefungen->pruefungenEinlesen();
	qDebug() << "einlesen------------: " << pruefungenList[0].getPArt();
    emit dataChanged(index, index);
    return true;
  }
  return false;
}

Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return 0;
	switch(index.column())
	{
		case 0:
			return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
		case 1:
			return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
		case 2:
			return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
		case 3:
			return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
		case 4:
			return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
		case 5:
			return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
    }
	return 0;
}

bool MyTableModel::insertRows( int row, int count, const QModelIndex & parent)
{
	row = rowCount(parent);
	int end = row;
	beginInsertRows(parent,row,end);
	
	myPruefungen->addPruefung(new MyPruefungen());

	endInsertRows();
}

MyPruefungenList * MyTableModel::getPruefungen()
{
	return myPruefungen;
}



void MyTableModel::setPruefungen(MyPruefungenList *pruefungen) 
{ 
    this->myPruefungen = pruefungen;
}

Qt::DropActions MyTableModel::supportedDropActions() const
{
	return Qt::CopyAction | Qt::MoveAction;
}
so....
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wo ist dein dropMimeData? 'Using Drag and Drop with Item Views' ist dir aber aus der Doku bekannt oder?
reuabreliz
Beiträge: 86
Registriert: 4. Oktober 2008 17:06

Beitrag von reuabreliz »

Hab was gelesen. Meine Funktion hab ich eh aus der Doku einfach kopiert. Also das dropmimeData() ist so wie setdata nur für gedropte elemente oder?
Antworten