versändnisfrage für drag'n'drop QTreeWidget

Alles rund um die Programmierung mit Qt
Antworten
petavonfrosta
Beiträge: 11
Registriert: 12. Februar 2012 20:25

versändnisfrage für drag'n'drop QTreeWidget

Beitrag von petavonfrosta »

Hallo,
ich hab mal wieder eine frage.. Ich habe mich durch zahlreiche tutorials durchgelesen und habe ein verständnis problem mit dem inplementieren von mousePressEvent.
Ich habe in meinem hauptfenster 2 QTreeWidget A und B. und möchte per drag'n'drop ein element von A nach B schieben. Es handelt sich dabei um pfad angaben.
Wenn ich ein element von A in ein anderes Programm verschiebe zb. dolphin dann wird die Datei kopiert.
Wenn ich von Dolphin ein element in mein Hauptfenster nach B schiebe wird auch die gewollte funktion ausgefürt.
nur wenn ich innerhalb meines Fensters von A nach B verschieben möchte passiert nichts.. bzw. die funktion mousePressEvent wird nicht ausgeführt.

Das problem ist sicherlich, das dass Drag nicht an QTreeWidget A gebunden ist, sondern am hauptfenster. Aber genau hier liegt mein verständnis problem:
alles in allem liegt mein programm in der haupt klasse hauptfenster.
so auch die deklaration von void mousePressEvent (QMouseEvent *event) innerhalb von public:

wie kann ich aber die deklaration von void mousePressEvent (QMouseEvent *event) an QTreeWidget A binden?
denn ich benutze keine weiteren klassen.

wenn ich eine klasse erstellen will... zb.

Code: Alles auswählen

class treewidget_a : public QTreeWidget {
public:
   void mousePressEvent (QMouseEvent *event) ;

 }
gibt es einen fehler: "error: redefination of class...."
kann mir eine von euch auf die sprünge helfen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: versändnisfrage für drag'n'drop QTreeWidget

Beitrag von Christian81 »

1. Wäre die komplette Fehlermeldung wichtig
2. Wäre der minimale Code bei dem die Fehlermeldung auftritt (das Stückchen erzeugt die Fehlermeldung sicher nicht) ebenso wichtig...
3. Wie Drag'n'Drop funktioniert steht in der Doku und man muss sicherlich nicht mousePressEvent überschreiben (siehe dragEnter/dragLeave & Co bzw. QMimeData)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
petavonfrosta
Beiträge: 11
Registriert: 12. Februar 2012 20:25

Re: versändnisfrage für drag'n'drop QTreeWidget

Beitrag von petavonfrosta »

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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: versändnisfrage für drag'n'drop QTreeWidget

Beitrag von Christian81 »

mein Problem ist, das ich nicht weiß wie ich zb. mousePressEvent an ein bestimmtes QTreeWidget (tW_ImportCDA) binde?
Das mousePressEvent ist doch innerhalb von ImportCDA - wo ist also das Problem?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
petavonfrosta
Beiträge: 11
Registriert: 12. Februar 2012 20:25

Re: versändnisfrage für drag'n'drop QTreeWidget

Beitrag von petavonfrosta »

Du meinst in der Urfassung. Also ohne die Erweiterung die zum Fehler führt.
Das Problem ist, dass void KAudioCopy::mousePressEvent (QMouseEvent* event) nicht ausgeführt wird, wenn ich auf ein QTreeWidget klicke. Ebenso nicht auf einen ToolButton und auch nicht auf einer ComboBox. Sondern nur wenn ich auf den Hintergrund des Hauptfensters klicke. Ich denke das diese Elemente den Mausklick abfangen.

Mir erschließt sich auch nicht warum ein anderes drag'n'drop ausgeführt wird. Denn wenn man von A -> B etwas verschiebt, dann wird ein element in B erzeugt. Aber nur mit den werten aus der erstens spalte von A (die TreeWidgets A und B haben mehrer spalten Artist, Title usw..). Jedoch wird dabei weder mousePressEvent noch dropEvent ausgeführt. Das sehe ich daran, weil ich in den ersten Zeilen der Funktion
ein qDebug() << "drag"; bzw "drop" zu stehen habe. In kombination mit C (also A -> C oder C -> B) wird jedoch die betreffende Funktion ausgeführt.
Wie kann ich die vorhandenen drag'n'drop Funktionen die mit Hilfe von Anwendung C laufen intern in meinem eigenen Hauptfenster anwenden?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: versändnisfrage für drag'n'drop QTreeWidget

Beitrag von Christian81 »

Sorry aber so ganz verstehe ich nicht wo das Problem liegt. Gib uns ein minimales, kompilierbares Beispiel an dem wir das Problem nachstellen können. Und mit minimal meine ich auch minimal und keine hundert Zeilen wie es aktuell der Fall ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
petavonfrosta
Beiträge: 11
Registriert: 12. Februar 2012 20:25

Re: versändnisfrage für drag'n'drop QTreeWidget

Beitrag von petavonfrosta »

kann ich dir auch ein zip file mit dem kompletten Programm per mail schicken?
Antworten