PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drag and Drop qt



gyros'nmaronen
21-04-2006, 09:41
Copy Paste

--------------------------------------------------------------------------------

Moin

Ich würde gerne in meiner Tabelle copy und pasten. Von externen Dokumenten text kopieren wäre auch schön, möchte aber erst mal kleine Brötchen backen. Könnt ihr mir helfen? MyMainWindow ist die Klasse wodrin meine Tabelle implementiert ist. Steh noch ziemlich am Anfang, was das Wissen von QT anbelangt.

Welche Funktionen gibt es bei QT? Danke schon mal im voraus....

MFG

bischi
21-04-2006, 12:26
Gehört in das Umgebungen,...-Board. Dort liest deinen Beitrag vielleicht auch jemand...

MfG Bischi

gyros'nmaronen
21-04-2006, 12:40
Bin noch Neuling was Foren anbelangt.
Danke.....

gyros'nmaronen
21-04-2006, 13:17
Wollte noch nachwerfen, dass ich Visual c++ benutze.

MFG

gyros'nmaronen
24-04-2006, 13:06
Kann mir keiner helfen?

anda_skoa
24-04-2006, 18:27
Die Frage ist zu oberflächlich, ich hab keine Ahnung was das eigentliche Problem ist.

Welche Klassen/Widgets benutzt du derzeit, was willst du kopieren, etc

Ciao,
_

gyros'nmaronen
25-04-2006, 09:29
Moin anda_skoa

Meine Klasse MyMainWindow ist von QWidget abgeleitet. Ich würde gerne Zahlen und Buchstaben in und von anderen Applikationen kopieren.
Die Zellen sollten ganz normal markiert werden können und mit CTRL+Key_C kopiert und mit CTRL+Key_V wieder eingefügt werden.
Ich weiß auch das QClipboard einige Funktionen bereit stellt. Aber wie funktioniert das.

Hier mal meine Funktion die die Tabelle erstellt:





void MyMainWindow::createUI ( void )
{

_mbox = new QMessageBox(this);
_mainMenu = new QMenuBar(this);
_filemenu = new QPopupMenu(this);
d = new QTextDrag( _myHighlightedText,this );
_exit = new QPushButton("Exit", this );
_dlg = new QDialog(this);
_store = new QPushButton("Suchen", _dlg );
_edit1 = new QLineEdit( _dlg );
_label1 = new QLabel("Text",this);
_label2 = new QLabel("Spalte",this);
_label3 = new QLabel("Zeile",this);
_topLayout = new QVBoxLayout( this,5);
_dlg1Layout = new QVBoxLayout( this,5);
_dlgLayout = new QHBoxLayout( _dlg,5);
_ptable = new QTable(this);
_rbutton = new QRadioButton(_dlg);
p = new QPainter(_ptable);



_filemenu->insertItem( "Suchen",this,SLOT(popup()),CTRL+Key_F );
_mainMenu->insertItem( "File",_filemenu );

_topLayout->addWidget(_mainMenu);
_topLayout->addWidget(_ptable);
_topLayout->addWidget(_exit);

_dlgLayout->addWidget(_edit1);
_dlgLayout->addWidget(_store);
_topLayout->addWidget(_label1);
_topLayout->addWidget(_label2);
_topLayout->addWidget(_label3);
_dlgLayout->addWidget(_rbutton);


_rbutton->setText("Aufwärts");

_ptable->setNumCols(4);
_ptable->setNumRows(200);

_ptable->setText( 0, 0, "12345" );
_ptable->setText( 1, 0, "12342325" );
_ptable->setText( 2, 0, "567" );
_ptable->setText( 0, 1, "bla" );
_ptable->setText( 1, 1, "blu" );
_ptable->setText( 2, 1, "blä" );
_ptable->setText( 150, 1, "bli" );
_ptable->setText( 152, 1, "bli" );

_ptable->setText( 170, 1, "bli" );

connect(_exit,SIGNAL(clicked()),this,SLOT(close()) );
connect(_store,SIGNAL(clicked()),this,SLOT(search( )));
connect(_rbutton,SIGNAL(clicked()),this,SLOT(setCh ecked(true)));




Ich hoffe das reicht dir!

MFG gyros'nmaronen

anda_skoa
25-04-2006, 15:18
Nur damit ich das richtig verstanden habe: du willst aus deinem Widget kopieren und nicht aus einem der untergeordnetem Widget wie dem Table oder dem LineEdit.

Wie stellt dein Widget seine eigene Daten dar, bzw wie erlaubt es den Input?

Oder für den Fall daß ich es falsch verstanden habe: die Qt Input Widgets können Copy&Paste ohnehin von sich aus.

Ciao,
_

gyros'nmaronen
25-04-2006, 16:06
Tut mir leid, dass ich mich so unklar ausgedrückt habe. Ich möchte gerne in meiner Tabelle mehrere Zellen markieren, mit STRG-C kopieren und an einer anderen Stelle in der Tabelle mit STRG-V wieder einfügen.
Kann dir ja mal meinen kompletten Code zeigen:

MyMainWindow.h


#ifndef _MYMAINWINDOW_H__
#define _MYMAINWINDOW_H__

#include <qmainwindow.h>
#include <qstringlist.h>
#include <qstring.h>
#include <qpushbutton.h>
#include <qwidget.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qtable.h>
#include <qpainter.h>
#include <qradiobutton.h>
#include <qevent.h>
#include <qdragobject.h>
#include <qpopupmenu.h>
#include <qmenubar.h>
#include <qmessagebox.h>
#include <qdialog.h>
#include <qclipboard.h>
#include <qgroupbox.h>

class MyMainWindow : public QWidget
{
Q_OBJECT
public:
MyMainWindow();
virtual ~MyMainWindow();
/* void dragEnterEvent( QDragEnterEvent *evt );
void dropEvent( QDropEvent *evt );
void mousePressEvent( QMouseEvent *evt );
void mouseMoveEvent( QMouseEvent * );*/
// setAcceptDrops(TRUE);

protected:

QString _word1;
QString _word2;
QString _text;
QDialog *_dlg;
QMessageBox *_mbox;
QGroupBox *_gbox;
QMenuBar *_mainMenu;
QPopupMenu *_filemenu;
QLabel *_label1;
QLabel *_label2;
QLabel *_label3;
QLabel *_label4;
QPushButton *_dlg_exit;
QPushButton *_exit;
QLineEdit *_edit1;
QPushButton *_store;
QBoxLayout *_topLayout;
QGridLayout *_dlg1Layout;
QGridLayout *_gboxLayout;
QRadioButton *_rbutton;
QTable *_ptable;
QPainter * p;
QDragObject * d;

// void paintCell( QPainter* , int zeile, int spalte );
void createUI ( void );
void startDrag ( void );
void dragEnterEvent(QDragEnterEvent*);
void dropEvent(QDropEvent*);

// void paintCell( QPainter* p, int zeile, int spalte )
protected slots:

void search (void);
void popup (void);
};

#endif



MyMainWindow.cpp


#include <iostream>

#include "stdafx.h"
#include "MyMainWindow.h"




//////////////////////////////////////////////////////////////////////

MyMainWindow::MyMainWindow()
{
createUI();


}

//////////////////////////////////////////////////////////////////////

MyMainWindow::~MyMainWindow()
{

}

//////////////////////////////////////////////////////////////////////


void MyMainWindow::createUI ( void )
{

_mbox = new QMessageBox(this);
_mainMenu = new QMenuBar(this);
_filemenu = new QPopupMenu(this);
// d = new QTextDrag( _myHighlightedText,this );
_exit = new QPushButton("Exit", this );
_dlg = new QDialog(this);
_gbox = new QGroupBox("&Zelle",_dlg);
_dlg_exit = new QPushButton("Abbrechen",_dlg);
_store = new QPushButton("Suchen", _dlg );
_edit1 = new QLineEdit( _dlg );
_label1 = new QLabel("Spalte:",_gbox);
_label2 = new QLabel("Zeile:",_gbox);
_label3 = new QLabel(_gbox);
_label4 = new QLabel(_gbox);
_topLayout = new QVBoxLayout( this,5);
_dlg1Layout = new QGridLayout( _dlg,0,0,10);
_gboxLayout = new QGridLayout(_gbox,3,3,13);
_ptable = new QTable(this);
_rbutton = new QRadioButton(_dlg);
p = new QPainter(_ptable);
// _exit->setGeometry (35,30,40,30);
_dlg -> setCaption("Suchen");
_gbox -> setAlignment(5);
// _gbox -> setInsideSpacing(10);
_gbox -> setFont (QFont("Times",10));
_filemenu->insertItem( "&Suchen",this,SLOT(popup()),CTRL+Key_F );
_filemenu->insertItem( "&Kopieren", this, SLOT(newFile()), CTRL+Key_C );
_filemenu->insertItem( "&Einfügen", this, SLOT(open()), CTRL+Key_V );
_mainMenu->insertItem( "&File",_filemenu );

_topLayout->addWidget(_mainMenu);
_topLayout->addWidget(_ptable);
_topLayout->addWidget(_exit);

_dlg1Layout->addWidget(_edit1,0,0);
_dlg1Layout->addWidget(_store,0,1);
_dlg1Layout->addWidget(_dlg_exit,1,1);
_dlg1Layout->addWidget(_rbutton,1,0);
_gboxLayout->addWidget(_label1,0,0);
_gboxLayout->addWidget(_label2,1,0);
_gboxLayout->addWidget(_label3,0,1);
_gboxLayout->addWidget(_label4,1,1);

_dlg1Layout->addWidget(_gbox,2,0);

_rbutton->setText("Aufwärts");

_ptable->setNumCols(4);
_ptable->setNumRows(200);

_ptable->setText( 0, 0, "12345" );
_ptable->setText( 1, 0, "12342325" );
_ptable->setText( 2, 0, "567" );
_ptable->setText( 0, 1, "bla" );
_ptable->setText( 1, 1, "blu" );
_ptable->setText( 2, 1, "blä" );

_ptable->setText( 150, 1, "bli" );
_ptable->setText( 152, 1, "bli" );

_ptable->setText( 170, 1, "bli" );


connect(_exit,SIGNAL(clicked()),this,SLOT(close()) );
connect(_store,SIGNAL(clicked()),this,SLOT(search( )));
connect(_dlg_exit,SIGNAL(clicked()),this,SLOT(Wind owClosed()));
connect(_rbutton,SIGNAL(clicked()),this,SLOT(setCh ecked(true)));
// connect(_ptable,SIGNAL(selectionChanged()),this,SL OT(



}

//////////////////////////////////////////////////////////////////////
void MyMainWindow::search (void)
{


_word1 = _edit1->text();
if (_rbutton->isChecked() == false)
{
for (int i = _ptable->currentColumn(); i <= _ptable->numCols(); i++)
{
for (int j = _ptable->currentRow()+1; j <= _ptable->numRows(); j++)
{
_word2 = _ptable->text(j,i);
if (_word1 == _word2)
{
_label3->setText(QString::number(i+1));
_label4->setText(QString::number(j+1));
_ptable->setCurrentCell(j,i);
_ptable->updateCell(j,i);
break;
}

}

}
for (i = _ptable->currentColumn()-1; i >= 0; i--)
{
for (int j = _ptable->currentRow()+1; j <= _ptable->numRows(); j++)
{
_word2 = _ptable->text(j,i);
if (_word1 == _word2)
{
_label3->setText(QString::number(i+1));
_label4->setText(QString::number(j+1));
_ptable->setCurrentCell(j,i);
_ptable->updateCell(j,i);
break;
}

}

}

}



if (_rbutton->isChecked() == true)
{
for (int x = _ptable->currentColumn(); x >= 0; x--)
{
for (int y = _ptable->currentRow()-1; y >= 0; y--)
{
_word2 = _ptable->text(y,x);
if (_word1 == _word2)
{
_label3->setText(QString::number(x+1));
_label4->setText(QString::number(y+1));
_ptable->setCurrentCell(y, x);
_ptable->updateCell(y,x);
break;
}

}

}
for (int i = _ptable->currentColumn()+1; i <= _ptable->numCols(); i++)
{
for (int j = _ptable->currentRow()-1; j >= 0; j--)
{
_word2 = _ptable->text(j,i);
if (_word1 == _word2)
{
_label3->setText(QString::number(i+1));
_label4->setText(QString::number(j+1));
_ptable->setCurrentCell(j,i);
_ptable->updateCell(j,i);
break;
}

}

}

}


}
//////////////////////////////////////////////////////////////////////
void MyMainWindow::popup(void)
{
_dlg->setSizeGripEnabled(FALSE);
_dlg->show();
}


Main-Funktion: qttest.cpp


#include "stdafx.h"

#include <qapplication.h>
#include "MyMainWindow.h"

int main(int argc, char* argv[])
{

QApplication a( argc, argv );

MyMainWindow mainwindow;

QObject::connect(&a,SIGNAL(lastWindowClosed()),&a,SLOT(quit()));

mainwindow.show();

return a.exec();

}



"search" ist eine Suchfunktion die meine Tabelle nach einem bestimmten String, den ich vorher eingeben kann durchsucht.
Sorry für meine schlechte Beschreibung. Ich hoffe du kannst damit was anfangen.

MFG

anda_skoa
25-04-2006, 22:53
Ah, besser.

Du willst also aus Zellen von _ptable in andere Zellen kopieren.

Geht es schon von Qt her mit einzelnen Zellen?

QClipboard brauchst du grob gesehen mal nur, so lange du aus der Applikation hinaus oder von einer andere Applikation herein kopieren willst.

Innerhalb der Applikation kannst du dir die Selection bzw die zu kopierenden Daten meistens auch direkt "merken"

Hmm, vielleicht sollte ich noch fragen ob das Qt3 oder Qt4 ist :)

Ciao,
_

gyros'nmaronen
26-04-2006, 09:39
Moin, moin anda_skoa

Meine Qt Version ist 3.3.4! Einzelne Zellen kann man kopieren, aber nur mit Doppelklick auf die Zelle und markieren des Textes.
Wenn ich jetzt mehrere Zellen kopieren will, merke ich mir Anfangs- und Endzelle der Markierung, lese die Strings die in dieser Markierung vorhanden sind in ein String ein und lese es ab der Stelle(Zelle) wo ich sie hinkopieren möchte wieder aus. Ist das richtig? Oder gibs dafür spezielle Funktionen. In andere Applikationen mehrere Zellen zu kopieren wäre auch sehr schön. Weiß aber wie gesagt nicht richtig wie das mit dem QClipboard funktioniert. Aus dem Turtorial von trolltech werd ich nicht so richtig schlau.

MFG gyros

anda_skoa
26-04-2006, 18:39
Für innerhalb der Applikation kannst du es so machen, nur aufpassen bei überlappenden Bereichen :)

Für das externe Copy&Paste könntest du die Zellenwerte zum Beispiel als Text kodieren, mit Tabs oder Komma die Spalten trennen und jede Reihe in einer Textzeile
Also praktisch eine CSV Formatierung.

Ich könnte mir vorstellen, daß andere Tabellen Programme das importieren können.

Ciao,
_

gyros'nmaronen
27-04-2006, 09:17
Guter Tip. Werds mal ausprobieren.
Danke für die Geduld und Hilfe!!!!!

MFG gyros