PDA

View Full Version : Drop on table and widget



core_st
27th October 2010, 22:41
Hi! I have Widget MainWindow and tableWidget in MainWindow. tableWidget is placed in the center of MainWindow. I need drop audio-files on Main Window. If i drop files to MainWindow then do such function, if i drop files on table - do another function. Can you help me?

i try to realize drop on mainWindow:
in header:

void dragEnterEvent (QDragEnterEvent *pe){
if (pe->mimeData()->hasFormat("text/uri-list")){
pe->acceptProposedAction();
}
}
void dropEvent (QDropEvent* pe);

in constructor


setAcceptDrops(true);

and


void MainWindow::dropEvent(QDropEvent *pe){
QList<QUrl> urlList=pe->mimeData()->urls();
QStringList str;
foreach (QUrl url, urlList ){
str<<url.toString();
QMessageBox::information(this,"yeah",url.toString());
}
// Some function with str
}

But i have crash on drop.

battersea
15th November 2010, 19:35
Comment out lines until the crash goes away. That way you know where things are going wrong...

My drop event (to add single files) looks as follows:


void dropEvent(QDropEvent* event) {
QString filePath;
if (event->mimeData()->hasFormat( "text/uri-list" )) {
QList<QUrl> urls = event->mimeData()->urls();
if (urls.isEmpty()) {
return;
}
if(urls.size()>1) {
return;
}
filePath = urls.first().toLocalFile();
if(filePath.isEmpty()) {
return;
}
}
// do something with filePath
}

janorcutt
15th November 2010, 21:10
you could use the model/view framework built in to qt to accept the dropped data into a model. you would have to subclass QStandardItemModel and override the drag/drop functions, then you just need to tell the view to use that model. here is some code modified from the Bangarang project...


bool MusicItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (action == Qt::IgnoreAction)
return true;

if (!data->hasFormat("text/uri-list"))
return false;

if (column > 0)
return false;

int beginRow;

if (row != -1) {
beginRow = row;
} else if (parent.isValid()) {
beginRow = parent.row();
} else {
beginRow = rowCount(QModelIndex());
}

QList<QUrl> urls = data->urls();

bool internalMove = false;
QStringList rowsToMove;
if (data->text().startsWith("Row:")) {
rowsToMove = data->text().split(",", QString::SkipEmptyParts);
internalMove = true;
}

QList<MusicItem> itemsInserted;
int insertionRow = beginRow;
for (int i = 0; i < urls.count(); i++) {
if (internalMove) {
QString rowEntry = rowsToMove.at(i);
int rowToMove = rowEntry.remove("Row:").toInt();
MusicItem item = itemAt(rowToMove);
itemsInserted << item;
QList<QStandardItem *> rowItems = getRowData(item);
insertRow(insertionRow, rowItems);
insertionRow = insertionRow + 1;
} else {
QString url = urls.at(i).toString();
if (QFile::exists(url)) {
MusicItem item = Convenience::itemFromUrl(url);
itemsInserted << item;
QList<QStandardItem *> rowItems = getRowData(item);
insertRow(insertionRow, rowItems);
insertionRow = insertionRow + 1;
}
}
}

insertionRow = beginRow;
foreach (MusicItem item, itemsInserted) {
int i = rowFromItemUrl(item.Url);
m_musiclist.insert(insertionRow, item);
m_urllist.insert(insertionRow, item.Url);
if (i != -1){
m_musiclist.removeAt(i);
m_urllist.removeAt(i);
}
insertionRow = insertionRow + 1;

}
return true;
}

Qt::ItemFlags MusicItemModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = Qt::ItemIsSelectable | Qt::ItemIsEnabled;

if (index.isValid()) {
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
} else {
return Qt::ItemIsDropEnabled | defaultFlags;
}
}

QMimeData* MusicItemModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QList<QUrl> urls;
QString indexList;
foreach (QModelIndex index, indexes) {
if (index.isValid() && index.column() != 1) {
QUrl url = QUrl(data(index, MusicItem::UrlRole).toString());
urls << url;
indexList += QString("Row:%1,").arg(index.row());
}
}

mimeData->setUrls(urls);
mimeData->setText(indexList);
return mimeData;
}

QStringList MusicItemModel::mimeTypes() const
{
QStringList types;
types << "text/uri-list" << "text/plain";
return types;
}

Qt::DropActions MusicItemModel::supportedDropActions() const
{
return Qt::MoveAction;
}

hope it helps