Seite 1 von 1
QTableView Drag and Drop
Verfasst: 27. Januar 2009 20:44
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?
Verfasst: 27. Januar 2009 20:50
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?
Verfasst: 27. Januar 2009 21:23
von upsala
Nachdem du deinen unbekannten Code selbst geschrieben hast, würde ich das überschreiben durch ein einfügen ersetzen...
Verfasst: 28. Januar 2009 16:59
von reuabreliz
Code: Alles auswählen
Qt::DropActions MyTableModel::supportedDropActions() const
{
return Qt::CopyAction;
}
Das ist meine DropAction in meinem Model.
Verfasst: 28. Januar 2009 19:09
von upsala
Hiermit überreiche ich dir den 1. Preis für den kürzesten Code für ein von QAbstractTableModel abgeleitetes Model.
Verfasst: 28. Januar 2009 19:12
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....
Verfasst: 28. Januar 2009 19:25
von upsala
Wo ist dein dropMimeData? 'Using Drag and Drop with Item Views' ist dir aber aus der Doku bekannt oder?
Verfasst: 28. Januar 2009 19:37
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?