Ansprechen einer Datei !!!

Alles rund um die Programmierung mit Qt
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Ansprechen einer Datei !!!

Beitrag von Coca »

Hier zeigt mir das ListWidget "xsd." dateien die es im Verzeichniss gibt. Aber nur die "xsd." dateien die auch eine dazu gehörige ".p7s" datei haben.
Bsp. Es gibt im Verzeichnis die Dateien "test1.xsd","test1.p7s" und "test2.xsd" also zeigt das ListWidget die Datei "test1.xsd" nur.

Code: Alles auswählen

void SchemaAdmin::InactiveList(QString s)
{
ui.InactiveList->clear();
	QDir Dir(s);
	
	for (int i=0;i<Dir.entryList(QStringList("*.xsd")).count();i++) 
	{ 
      	  QString sFileName = Dir.entryList(QStringList("*.xsd")).at(i); 

	  QString sFileString = Dir.absolutePath(); 
	  sFileString+="/";
	  sFileString+=sFileName.section(".",0,0); 
	  sFileString+=".p7s"; 

	  QFile File(sFileString);
	  if (File.exists()==true)
	  {
		  ui.InactiveList->addItem(sFileName);
	  }		
	  
	}  
}
Ich möchte jetzt Folgendes in der ListWidget werden mehrer ".xsd" Dateien angezeigt.
Ich möchte eine auswählen können, und wenn ich auf Install klicke mit dieser arbeiten, aber nicht nur mit der "xsd." sondern auch mit der dazu gehörigen ".p7s"

wie spreche Ich diese Datei an ???

Code: Alles auswählen

void SchemaAdmin::on_BtnInstall_clicked()
{


}
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

und wenn ich auf Install klicke mit dieser arbeiten
Was meinst du genau damit? Was genau möchtest du damit machen?
Weißt du nicht, wie du auf den Dateinamen kommst?

Bitte ein bisschen genauer.

MfG
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Alci hat geschrieben:
und wenn ich auf Install klicke mit dieser arbeiten
Was meinst du genau damit? Was genau möchtest du damit machen?
Weißt du nicht, wie du auf den Dateinamen kommst?

Bitte ein bisschen genauer.

MfG

Also ich will zb. die ausgewählte Datei "xsd." und die dazu gehörige ".p7s" die man nicht im ListWidget sieht für diese Defines benutzen und damit weiter arbeiten.

Code: Alles auswählen

                #define SIGFILE ....
               #define XSDFILE ....
Im Weiteren Ablauf ist es So das die beiden Dateien Mit einer CryptClass kontroliert werden ob die signature stimmt usw...
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Also du willst den Dateinamen der .p7s Datei, wenn ich es richtig verstanden habe.

Der Dateiname der .xsd und der Pfad zu derer ist dir ja bereits bekannt.
Du musst halt nur .p7s als Dateiendung verwenden. Keine Ahnung, wo die Schwierigkeit jetzt dabei sein soll.

Code: Alles auswählen

QFileInfo FileInfo(<Datei>);
QString BaseName = FileInfo.baseName();
QString Path = FileInfo.absolutePath(); //Vielleicht musst du da noch '/' dranhängen
QString NewExtension(".p7s");

QString NewFile = Path + BaseName + NewExtension
Edit: Das mit den defines habe ich nicht wirklich verstanden.

MfG, Alci.
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Also nehmen wir mal an das hier ist mein ListWidget

########
#test.xsd #
#text1.xsd#
#text2.xsd#
#text3.xsd#
########

Hier habe ich ein Button Install
----------
| Install |
----------

Also Ich wähle mit meiner Maus einen Item im Widget

########
#test.xsd #
#text1.xsd# ------------
#text2.xsd# und Klicke auf | Install |
#text3.xsd# ------------
########


Die Funktion Install soll folgendes übergeben bekommen.
Die ausgewählte ".xsd" Datei und die dazu gehörige ".p7s" Datei.
Weil Ich in der Funktion Install eine Funktion Von CryptClass aufrufe die diese beiden Dateien möchte

Code: Alles auswählen

void SchemaAdmin::on_BtnInstall_clicked()
{
#define SIGFILE ... 
#define XSDFILE ..

crypt(SIGFILE,XSDFILE)
}
also wie übergebe ich der Funktion Install das ich einen Item gewählt habe ind der ListWidget und diese eine ".xsd" Datei ist der noch eine dazu gehörige ".p7s" hat.

Code: Alles auswählen

#define XSDFILE .. //hier das ist deine ".xsd" die im ListWidget gewählt wurde
#define SIGFILE ... //hier das ist die dazugehörge ".p7s" 

Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Ok, jetzt ist alles klar.
Entweder rufst du in deiner on_BtnInstall_clicked() Funktion selectedItems() von QListWidget auf, da bekommst du die Liste aller ausgewählten Items (über die Methode text() greifst du auf den Text, also den Dateinamen zu).
Oder, was meiner Meinung nach besser wäre, über Slot und Signals:
QObject::connect(<deine_qlistwidget>, SIGNAL(itemClicked(QListWidgetItem*)), <receiver>, SLOT(<slot_methode>(QListWidgetItem*)));

Qt liefert übrigens auch eine 1a Doku mit, da solltest du eigentlich auch alles finden.

MfG, Alci.
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Verständis Fragen.

1.

Code: Alles auswählen

QObject::connect(InactiveList,SIGNAL(itemClicked(QListWidgetItem*)), 
		            <receiver>, SLOT(<slot_methode>(QListWidgetItem*)));
Receiver ?? Slot_methode ?? Verstehe nicht was die machen ?
legt dieser ein obejkt an ?

2. Mir fehlt irgendwie ein beispiel. Für das verständniss also wenn ich ein objekt anlege damit. z.B. data1 heißt das in diesem objekt der pfad zu dieser datei steht die ich im Listwidget angeklickt habe?
wenn ja wie spreche ich dann die zweite datei an ?.

Ich komme irgendwie damit nicht klar.
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Folgendes:

Hier wird im QListWidget der Inhalt vom Aktuellen Ordner Angezeigt.

Code: Alles auswählen

void SchemaAdmin::InactiveList(QString s)

{

ui.InactiveList->clear();

QDir Dir(s);


for (int i=0;i<Dir.entryList(QStringList("*.xsd")).count();i++) 

{ 

QString sFileName = Dir.entryList(QStringList("*.xsd")).at(i); 

QString sFileString = Dir.absolutePath(); 

sFileString+="/";

sFileString+=sFileName.section(".",0,0); 

sFileString+=".p7s"; 

QFile File(sFileString);

if (File.exists()==true)

{

ui.InactiveList->addItem(sFileName);

} 


} 

}

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


Mit dieser Funktion wähle ich das Verzeichnis:

Code: Alles auswählen

void SchemaAdmin::on_BtnBrowse_clicked()

{

QString sTemp;

QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Infodas\\RS-Gate\\Viewer",QSettings::NativeFormat);


sTemp = settings.value("SchemaOutputDir").toString();



ui.label_Inactive->setText(sTemp);



QString sCurrentFolder = QFileDialog::getExistingDirectory(this,

tr("Bitte Wählen Sie ein Verzeichniss"),

sTemp,

QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

ui.label_Inactive->setText(sCurrentFolder);

InactiveList(sCurrentFolder);

}


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


Wenn ich auf den Button Install klicke soll folgendes passieren

er soll die Datei ".xsd" bekommen die im ListWidget ausgewählt worden ist und die dazugehörige ".p7s" datei.

Die ".p7s" datei wird nicht im ListWidget angezeigt.


Code: Alles auswählen

 

void SchemaAdmin::on_BtnInstall_clicked()
{


control(data1, data2);

}
Die Kontrolle Funktion die ich heir aufrufe soll 2 Strings bekommen und zwar den Pfad der .xsd und der .p7s datei.
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Du hast wohl noch nicht viel mit SIGNAL und SLOT gemacht, was? Das ist nämlich eine Besonderheit von QT.

Jede Klasse von QT hat Methoden, die (in der Doku) als SIGNAL gekennzeichnet sind. Diese Methoden sind spezielle Methoden, das sind Signale, die auftreten wenn der Benutzer eine bestimmte Aktion mit einem Widget gemacht hat.

Dieses Signal kann mit einem Slot verbunden werden. Das ganze wird mit QObject::connect (oder nur connect, wenn deine Klasse ein QObject ist) gemacht.

So, nun kannst du deine eigenen SLOTs definieren, mit denen du ein Signal verarbeiten kannst. Ein SLOT muss als Rückgabewert immer void haben und ein SLOT muss die gleichen Übergabeparameter haben wie ein SIGNAL.

Ein SIGNAL kannst du mit mehreren SLOTS verbinden.

Ein konkretes Beispiel:

Code: Alles auswählen

class MyWidget : public QDialog
{
Q_OBJECT //dieses Macro muss du angeben, wenn deine Klasse SLOT's enthält

private:
QListWidget* m_pListWidget;

public:
MyWidget(void);

public slots: //ab hier definierst du deine SLOT's
void ItemSelected(QListWidgetItem* pSelectedItem); //Rückgabetyp: void, Übergabeparameter müssen mit denen des Signals übereinstimmen

private:
void Init(void);

}

//cpp-file
MyWidget::MyWidget(void)
{
Init();
}

MyWidget::ItemSelected(QListWidgetItem* pSelectedItem)
{
//dieser Slot wird aufgerufen, sobald das signal "itemClicked" ausgelöst wurde
}

void MyWidget::Init(void)
{
//hier z. B. erstellst du deine QListWidget
m_pListWidget = new QListWidget(this);
//verbindung zwischen SLOT und SIGNAL herstellen
QObject::connect(m_pListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(ItemSelected(QListWidgetItem*)));

/*
- zuerst wird der Sender angegeben, in diesem Beispiel ist es die ListWidget
- dann wird die SIGNAL-Methode angegeben, die ein Senderobject zur Verfügung stellt (siehe Doku), in diesem Beispiel ist es das Signal itemClicked, dass immer dann ausgelöst wird, wenn ein User ein Item angeklickt hat
- dann wird der Empfänger angegeben, der die passende SLOT Methode aufweist
- und zum Schlusswird die SLOT-Methode angegeben, die beim Sender definiert sein muss.

Wenn eine verbindung zwischen SLOT und SIGNAL nicht hergestellt werde konnte, liefert connect false zurück.
Auf den ersten Blick ist dieses Verfahren recht aufwendig, aber wenn du es einmal verstanden hast, möchtest du es nicht mehr missen.
*/
}
MfG, Alci.
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Mach folgendes:
füge in deine Klasse

Code: Alles auswählen

class SchemaAdmin
{
//ganz oben
Q_OBJECT

//ganz unten
public slots:
void ItemSelected(QListWidgetItem* pSelected);
...
}

//cpp-file


void SchemaAdmin::SchemaAdmin(void)
{
//Nachdem du z. B. im Konstruktor deine QListWidget erstellst hast
QObject::connect(<deine_liste>, SIGNAL(itemClicked(QListWidgetItem*), this, SLOT(ItemSelected(QListWidgetItem*)));
}

void SchemaAdmin::ItemSelected(QListWidgetItem* pSelected)
{
//pSelected->text() ist dann das Label in deiner QListWidget
//und dein Label entspricht ja den Dateinamen
}
So sollte es eigentlich funktionieren. Du könntest aber auch in deiner on_BtnBrowse_clicked() Methode auch folgendes machen:

Code: Alles auswählen

QList<QListWidgetItem*> SelectedItems = <deine_liset>.selectedItems();

for (int i = 0; i < SelectedItems.count() ++i)
{
QListWidgetItem* pItem = SelectedItems[i];
//pItem->text() ist dann das Label aus deiner QListWidget
}
MfG, Alci.
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Aber so habe ich ja nur den Namen des Item.

Ich will ja im String data1 den kompletten pfad der datei haben.

Code: Alles auswählen


	QString data1;

	QList<QListWidgetItem*> SelectedItems = ui.InactiveList->selectedItems(); 

	for (int i = 0; i < SelectedItems.count(); ++i) 
	{ 
	QListWidgetItem* pItem = SelectedItems[i]; 
	data1 = pItem->text();
	} 

Also im ui.InactiveList (ListWidget) werden alle Dateien vom Typ .xsd angezeigt.
Aber nur die .xsd dateien die auch eine .p7s enthält.
Beispiel der Ordner hat folgende Dateien im Verzeichniss

test.xsd
test2.xsd
test3.xsd
test4.xsd
test.p7s
test2.p7s
test3.p7s

Also zeigt mit der ui.InactiveList (ListWidget) nur diese an:

test.xsd
test2.xsd
test3.xsd

So jetzt wähle ich "test.xsd" von der Liste und klicke auf den Button_Install

das heist der soll folgendes bekommen

data1 = "C:\\temp\\test.xsd"
data2 = "C:\\temp\\test.p7s"
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Da hast du mehrere Möglichkeiten, wie du das lösen könntest (abhängig von deinem Code):

Endweder du speicherst den aktuellen Ordner, in dem sich die Dateien befinden als Member deiner Klasse, oder:

Bei jedem Item kannst du zusätzliche Daten mitspeichern.
Die Klasse QListWidgetItem (sollte) die Methode setData bereitstellen
Das könntest du wie folgt hernehmen:

Code: Alles auswählen

QVariant data;
data.setValue(<der_pfad_zum_item>);
QListWidgetItem Item;
Item.setData(data)
Das Item fügst du dann der Liste hinzu. Wenn du jetzt einen Eintrag aus der Liste ausgewählt hast, kannst du ja auf die selektierten QListWidgetItem's zugreifen (in deiner on_BtnBrowse_clicked Methode).

Da holst du dir für das jeweilige item (mit data()) dann den dazugehörigen Pfad. Diese Lösung ist zwar Speicherverschwenderisch, aber für's erste mal ausreichend. Du könntest das ganze weiterhin optimieren, indem du nur einen Zeiger auf ein QString-Objekt speicherst, das wiederrum den jeweiligen Pfad enthält. Aber wie gesagt, für's erste sollte der obere Vorschlag ausreichen, denke ich.

MfG, Alci.
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Alci hat geschrieben:Da hast du mehrere Möglichkeiten, wie du das lösen könntest (abhängig von deinem Code):

Endweder du speicherst den aktuellen Ordner, in dem sich die Dateien befinden als Member deiner Klasse, oder:

Bei jedem Item kannst du zusätzliche Daten mitspeichern.
Die Klasse QListWidgetItem (sollte) die Methode setData bereitstellen
Das könntest du wie folgt hernehmen:

Code: Alles auswählen

QVariant data;
data.setValue(<der_pfad_zum_item>);
QListWidgetItem Item;
Item.setData(data)
Das Item fügst du dann der Liste hinzu. Wenn du jetzt einen Eintrag aus der Liste ausgewählt hast, kannst du ja auf die selektierten QListWidgetItem's zugreifen (in deiner on_BtnBrowse_clicked Methode).

Da holst du dir für das jeweilige item (mit data()) dann den dazugehörigen Pfad. Diese Lösung ist zwar Speicherverschwenderisch, aber für's erste mal ausreichend. Du könntest das ganze weiterhin optimieren, indem du nur einen Zeiger auf ein QString-Objekt speicherst, das wiederrum den jeweiligen Pfad enthält. Aber wie gesagt, für's erste sollte der obere Vorschlag ausreichen, denke ich.

MfG, Alci.



Ja aber ich will doch den Pfad des Item bekommen und nicht ihm selber übergeben.
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag von Alci »

Hier nochmal der Code, der von dir weiter oben gepostet wurde:

Code: Alles auswählen

void SchemaAdmin::InactiveList(QString s) 
{ 

ui.InactiveList->clear(); 

[b]//s => IST JA DER ORDNER, ALSO HAST DU JA SCHON ALLES, WAS DU BRAUCHST[/b]

QDir Dir(s); 


for (int i=0;i<Dir.entryList(QStringList("*.xsd")).count();i++) 
{ 

QString sFileName = Dir.entryList(QStringList("*.xsd")).at(i); 
QString sFileString = Dir.absolutePath(); 

sFileString+="/"; 

sFileString+=sFileName.section(".",0,0); 

sFileString+=".p7s"; 

QFile File(sFileString); 

if (File.exists()==true) 
{ 
[b]//Hier fügst du den Dateinamen zur Liste hinzu
//Hier machst du dann folgendes:
QListWidgetItem pItem = new QListWidgetItem(sFileName);
//Hier speicherst du den Ordner ab, indem sich die Datei befindet!!!
QVariant data(s);
pItem->setData(Qt:UserRole, data);
ui.InactiveList->addItem(pItem); [/b]
}
} 
} 
Weiß echt nicht, was daran so kompliziert sein soll. Du speicherst halt für jede Datei in deiner Liste auch den Ordner ab, in dem sich diese Datei befindet. Wie willst du an die Datei sonst rankommen? Du musst doch irgendwie einen Pfad speichern, anders gehts gar nicht.

MfG, Alci.
Coca
Beiträge: 42
Registriert: 3. April 2006 13:53
Kontaktdaten:

Beitrag von Coca »

Code: Alles auswählen

 QFile File(sFileString);
	  if (File.exists()==true)
	  {
		
Zeile118		  QListWidgetItem pItem = new QListWidgetItem(sFileName); 
		                     QVariant data(s);  
		                    pItem.setData(Qt::UserRole, data); 
Zeile121		  ui.InactiveList->addItem(pItem);
FEhlermeldung:

SchemaAdmin.cpp(118) : error C2440: 'Initialisierung': 'QListWidgetItem *' kann nicht in 'QListWidgetItem' konvertiert werden
Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
SchemaAdmin.cpp(121) : error C2664: 'void QListWidget::addItem(const QString &)': Konvertierung des Parameters 1 von 'QListWidgetItem' in 'const QString &' nicht möglich
Ursache: Konvertierung von 'QListWidgetItem' in 'const QString' nicht möglich
Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
Antworten