Okay, ich dachte ich hätte den Fall gut dargestellt. Aber kein problem...
Grundsätzlich habe ich erstmal keine Fehler. Sondern es funktioniert nicht so wie von mir gedacht. Zur Hilfe nehme ich mal eine dritt Anwendung zb. Dolphin (kurz C).
Meine Anwendung hat zwei QTreeWidget Elemente (A und B), bei denen ich per Drag'n'Drop einzelne Elemente (items) verschieben möchte.
von A -> B funktioniert nicht (das ist mein Problem).
von A -> C funktioniert.
von C -> B funktioniert.
meine main.cpp
Code: Alles auswählen
//--- main.cpp - start ---
#include <QDebug>
#include "KAudioCopy.h"
#include <KApplication>
#include <QtCore>
#include <QtGui>
#include <QDir>
#include <QFileInfo>
#include <QString>
#include "kapplication.h"
#include "kaboutdata.h"
#include "klocalizedstring.h"
#include "kmessagebox.h"
#include "kcmdlineargs.h"
#include "kmainwindow.h"
int main (int argc, char* argv[]) {
KApplication app;
app.setApplicationName("KAudioCopy");
KAudioCopy w;
w.show();
return app.exec();
}
//--- main.cpp - end ---
KAudioCopy.h
Code: Alles auswählen
//--- KAudioCopy.h - start ---
#ifndef KAUDIOCOPY_H
#define KAUDIOCOPY_H
#include "ui_KAudioCopy.h"
#include <phonon/audiooutput.h>
#include <phonon/seekslider.h>
#include <phonon/mediaobject.h>
#include <phonon/volumeslider.h>
#include <phonon/backendcapabilities.h>
#include <Phonon/MediaController>
#include "kapplication.h"
#include "kaboutdata.h"
#include "klocalizedstring.h"
#include "kmessagebox.h"
#include "kcmdlineargs.h"
#include "kmainwindow.h"
#include <kio/scheduler.h>
#include <kurl.h>
#include <kio/jobclasses.h>
#include <QtGui>
class KAudioCopy : public QMainWindow, public Ui::MainWindow {
Q_OBJECT
public:
KAudioCopy (QMainWindow *parent = 0);
void Drag(QWidget *parent = 0);
void mousePressEvent (QMouseEvent *event);
~KAudioCopy();
protected:
void dragEnterEvent (QDragEnterEvent* event);
void dropEvent (QDropEvent* event);
private slots:
void switch_Filesystem();
void switch_Database();
void switch_Import();
private:
Phonon::SeekSlider *seekSlider;
Phonon::MediaObject *mediaObject;
Phonon::MediaObject *metaInformationResolver;
Phonon::AudioOutput *audioOutput;
Phonon::VolumeSlider *volumeSlider;
Phonon::MediaController *mediaController;
QList <Phonon::MediaSource> sources;
};
#endif //KAUDIOCOPY_H
//--- KAudioCopy.h - end ---
KAudioCopy.cpp
Code: Alles auswählen
//--- KAudioCopy.cpp - start ---
#include "KAudioCopy.h"
#include <QDir>
#include <QFileInfo>
#include <QString>
#include <QtCore>
#include <QtGui>
#include <QListView>
#include <QtXml>
#include "kapplication.h"
#include "kaboutdata.h"
#include "klocalizedstring.h"
#include "kmessagebox.h"
#include "kcmdlineargs.h"
#include "kmainwindow.h"
#include <kio/scheduler.h>
#include <kurl.h>
#include <kio/jobclasses.h>
#include <Phonon/MediaController>
#include <QDebug>
KAudioCopy::KAudioCopy (QMainWindow *parent) : QMainWindow(parent) {
audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
mediaObject = new Phonon::MediaObject(this);
mediaController = new Phonon::MediaController( mediaObject );
metaInformationResolver = new Phonon::MediaObject(this);
mediaObject -> setTickInterval(1000);
Phonon::createPath(mediaObject, audioOutput);
setAcceptDrops(true);
setupUi (this);
volumeSlider = new Phonon::VolumeSlider(this);
volumeSlider -> setAudioOutput(audioOutput);
volumeSlider -> setGeometry(tB_next -> geometry().x() + tB_next -> geometry().width() +10,tB_next -> geometry().y()+31,100,30);
seekSlider = new Phonon::SeekSlider(this);
seekSlider -> setMediaObject(mediaObject);
seekSlider -> show();
seekSlider -> setGeometry(volumeSlider -> geometry().x() + volumeSlider -> geometry().width() +10, tB_next -> geometry().y()+34,(lcd_player -> geometry().x()) -(volumeSlider -> geometry().x() + volumeSlider -> geometry().width() +20),21);
QPalette palette;
palette.setBrush(QPalette::Light, Qt::darkGray);
lcd_player -> setPalette(palette);
connect (tB_Filesystem, SIGNAL (clicked()), this, SLOT (switch_Filesystem()));
connect (tB_Database, SIGNAL (clicked()), this, SLOT (switch_Database()));
connect (tB_Import, SIGNAL (clicked()), this, SLOT (switch_Import()));
connect (cB_Filesystem, SIGNAL (currentIndexChanged(int)), this, SLOT (cB_Filesystem_changed()));
connect (tW_root_folders, SIGNAL (itemClicked(QTreeWidgetItem*,int)), this, SLOT (showDirectory(QTreeWidgetItem*, int)));
connect (cB_URL, SIGNAL (currentIndexChanged(int)), this, SLOT (showPath()));
connect (tW_root_folders, SIGNAL (itemSelectionChanged()), this, SLOT (showFiles_root()));
connect (tW_root_files, SIGNAL (doubleClicked(QModelIndex)), this, SLOT (playmusicRootFiles()));
connect (mediaObject, SIGNAL (tick(qint64)), this, SLOT (tick(qint64)));
connect (mediaObject, SIGNAL (stateChanged(Phonon::State,Phonon::State)), this, SLOT (stateChanged(Phonon::State, Phonon::State)));
//connect (metaInformationResolver, SIGNAL (stateChanged(Phonon::State, Phonon::State)), this, SLOT (metaStateChanged (Phonon::State, Phonon::State)));
//connect (mediaObject, SIGNAL (currentSourceChanged(Phonon::MediaSource)), this, SLOT (sourceChanged(Phonon::MediaSource)));
//connect (mediaObject, SIGNAL (aboutToFinish()), this, SLOT (aboutToFinish()));
connect (tB_playPause, SIGNAL (clicked(bool)), mediaObject, SLOT (play()));
connect (tB_stop, SIGNAL (clicked(bool)), mediaObject, SLOT (stop()));
connect (cB_Places, SIGNAL (currentIndexChanged(QString)), this, SLOT (change_PlacesTreeView()));
connect (tW_Places_folders, SIGNAL (itemClicked(QTreeWidgetItem*,int)), this, SLOT (showDirectory_Places(QTreeWidgetItem*,int)));
connect (tW_PlacesFiles, SIGNAL (doubleClicked(QModelIndex)), this, SLOT (playmusicPlacesFiles()));
connect (cB_ImportDevice, SIGNAL (currentIndexChanged(int)), this, SLOT (change_Import()));
connect (tW_ImportFolders, SIGNAL (itemClicked(QTreeWidgetItem*,int)), this, SLOT (showDirectory_Import(QTreeWidgetItem*,int)));
connect (tW_ImportFiles, SIGNAL (doubleClicked(QModelIndex)), this, SLOT (playmusicImportFiles()));
connect (tW_ImportCDA, SIGNAL (doubleClicked(QModelIndex)), this, SLOT (playmusicImportCDA()));
connect (tB_eject, SIGNAL (clicked()), this, SLOT (ejectCD_ROM()));
//defaults
tB_Filesystem -> setChecked(true);
cB_Filesystem_changed();
sW_main_front -> setCurrentIndex(0);
cB_URL -> addItem("/");
initial_root_foldertree();
initial_Places();
//initial_Import();
initial_playlist();
setWindowIcon(QIcon("tools-rip-audio-cd.png"));
tB_Filesystem -> setIcon(QIcon(setting_iconFilemanager));
tB_Database -> setIcon(QIcon(setting_iconDatabase));
tB_Import -> setIcon(QIcon(setting_iconImport));
cB_Filesystem -> setItemIcon(0, QIcon(setting_rootIcon));
cB_Filesystem -> setItemIcon(1, QIcon(setting_iconFavorites));
cB_Filesystem -> setItemIcon(2, QIcon(setting_iconRemovable));
tB_playPause -> setIcon(QIcon(setting_buttonStart));
tB_playPause -> text() = "";
tB_playPause -> setIconSize(QSize(40, 40));
tB_playPause -> setEnabled(false);
tB_stop -> setIcon(QIcon(setting_buttonStop));
tB_stop -> text() = "";
tB_stop -> setIconSize(QSize(40, 40));
tB_stop -> setEnabled(false);
tB_previous -> setIcon(QIcon(setting_buttonBack));
tB_previous -> text() = "";
tB_previous -> setIconSize(QSize(40, 40));
tB_previous -> setEnabled(false);
tB_next -> setIcon(QIcon(setting_buttonForward));
tB_next -> text() = "";
tB_next -> setIconSize(QSize(40, 40));
tB_next -> setEnabled(false);
tB_eject -> setIcon(QIcon(setting_buttonEject));
tB_eject -> text() = "";
tB_eject -> setIconSize(QSize(40,40));
tB_eject -> setVisible(false);
tB_PlaylistUp -> setIcon(QIcon(setting_iconUp));
tB_PlaylistUp -> text() = "";
tB_PlaylistUp -> setIconSize(QSize(40,40));
tB_PlaylistUp -> setEnabled(false);
tB_PlaylistDown -> setIcon(QIcon(setting_iconDown));
tB_PlaylistDown -> text() = "";
tB_PlaylistDown -> setIconSize(QSize(40,40));
tB_PlaylistDown -> setEnabled(false);
tB_PlaylistDelete -> setIcon(QIcon(setting_iconDelete));
tB_PlaylistDelete -> text() = "";
tB_PlaylistDelete -> setIconSize(QSize(40, 40));
tB_PlaylistDelete -> setEnabled(false);
lcd_player -> display("00:00");
}
KAudioCopy::~KAudioCopy() {
}
void KAudioCopy::switch_Filesystem() {
sW_main_front -> setCurrentIndex(0);
tB_Database -> setChecked(false);
tB_Import -> setChecked(false);
tB_Filesystem -> setChecked(true);
}
void KAudioCopy::switch_Database() {
sW_main_front -> setCurrentIndex(1);
tB_Filesystem -> setChecked(false);
tB_Import -> setChecked(false);
tB_Database -> setChecked(true);
}
void KAudioCopy::switch_Import() {
sW_main_front -> setCurrentIndex(2);
tB_Database -> setChecked(false);
tB_Filesystem -> setChecked(false);
tB_Import -> setChecked(true);
initial_Import();
}
..
..
..
..
..
..
void KAudioCopy::initial_playlist() {
QTreeWidgetItem *headeritem = new QTreeWidgetItem();
headeritem -> setText(0, QString(setting_position));
headeritem -> setText(1, QString(setting_artist));
headeritem -> setText(2, QString(setting_title));
headeritem -> setText(3, QString(setting_length));
headeritem -> setText(4, QString(setting_size));
headeritem -> setText(5, QString(setting_filename));
headeritem -> setText(6, QString(setting_path));
headeritem -> setText(7, QString(setting_typ));
headeritem -> setText(8, QString(setting_count));
headeritem -> setText(9, QString(setting_mark));
tW_playlist -> setHeaderItem( headeritem);
tW_playlist -> setColumnCount(10);
pB_Playlist -> setValue(0);
tW_playlist -> setAcceptDrops(true);
}
void KAudioCopy::dragEnterEvent (QDragEnterEvent* event) {
const QMimeData* mimedata = event -> mimeData();
if (event && mimedata -> hasUrls()) {
event -> acceptProposedAction();
}
}
void KAudioCopy::dropEvent (QDropEvent* event) {
if (event && event -> mimeData()) {
const QMimeData *data = event -> mimeData();
if (data -> hasUrls()) {
QList<QUrl> urls = data -> urls();
if (urls.isEmpty() ) {
return;
}
QString filename = urls.first().toLocalFile();
if (filename.isEmpty()) {
return;
}
dropFile(filename);
}
}
}
void KAudioCopy::mousePressEvent(QMouseEvent* event) {
qDebug() << "click";
if (event -> button() == Qt::LeftButton) {
QMimeData* mimedata = new QMimeData;
QList<QUrl> urls;
urls.append(tW_ImportCDA -> currentItem() -> text(6));
mimedata -> setUrls(urls);
QDrag *drag = new QDrag (this);
drag -> setMimeData(mimedata);
drag -> start();
qDebug() <<" Drag: -> " << urls;
}
QWidget::mousePressEvent(event);
}
void KAudioCopy::dropFile (const QString filename) {
if (!filename.isEmpty()) {
qDebug() << filename;
}
}
//--- KAudioCopy.cpp - end ---
um den code etwas einzukürzen habe ich andere Funktionen durch punkte angedeutet.
soweit läuft die Anwendung fehlerfrei. Wenn ich auf den Fensterhintergrund ein Drag ausführe funktioniert es.
Aber nicht wenn ich es auf ein QTreeWidget (tW_ImportCDA) ausführe. Ich sehe das die Funktion mousePressEvent nicht
ausgeführt wird.
wenn ich jetzt AudioCopy.h um folgende zeilen ergänze
Code: Alles auswählen
class tW_ImportCDA : public QTreeWidget {
Q_OBJECT
public:
void mousePressEvent (QMouseEvent *event);
};
und KAudioCopy.cpp um folgende zeilen
Code: Alles auswählen
void tW_ImportCDA::mousePressEvent(QMouseEvent* event) {
qDebug() << "click";
if (event -> button() == Qt::LeftButton) {
QMimeData* mimedata = new QMimeData;
QList<QUrl> urls;
urls.append(KAudioCopy::tW_ImportCDA -> currentItem() -> text(6));
mimedata -> setUrls(urls);
QDrag *drag = new QDrag (this);
drag -> setMimeData(mimedata);
drag -> start();
qDebug() <<" Drag: -> " << urls;
}
QWidget::mousePressEvent(event);
}
dann erhalte ich folgende Fehlermeldung:
Code: Alles auswählen
/home/rene/Dokumente/gui/KAudioCopy/ui_KAudioCopy.h: In member function ‘virtual void tW_ImportCDA::mousePressEvent(QMouseEvent*)’:
/home/rene/Dokumente/gui/KAudioCopy/ui_KAudioCopy.h:81:18: error: invalid use of non-static data member ‘Ui_MainWindow::tW_ImportCDA’
/home/rene/Dokumente/gui/KAudioCopy/KAudioCopy.cpp:1219:29: error: from this location
make[2]: *** [CMakeFiles/KAudioCopy.dir/KAudioCopy.o] Fehler 1
make[1]: *** [CMakeFiles/KAudioCopy.dir/all] Fehler 2
mein Problem ist, das ich nicht weiß wie ich zb. mousePressEvent an ein bestimmtes QTreeWidget (tW_ImportCDA) binde?