Seite 1 von 2
Ansprechen einer Datei !!!
Verfasst: 7. April 2006 13:47
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 ???
Verfasst: 7. April 2006 14:06
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
Verfasst: 7. April 2006 14:37
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.
Im Weiteren Ablauf ist es So das die beiden Dateien Mit einer CryptClass kontroliert werden ob die signature stimmt usw...
Verfasst: 7. April 2006 14:51
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.
Verfasst: 7. April 2006 15:18
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"
Verfasst: 7. April 2006 17:07
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.
Verfasst: 10. April 2006 10:35
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.
Verfasst: 10. April 2006 11:12
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.
Verfasst: 10. April 2006 11:25
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.
Verfasst: 10. April 2006 11:43
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.
Verfasst: 10. April 2006 13:08
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"
Verfasst: 10. April 2006 14:07
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.
Verfasst: 10. April 2006 14:38
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.
Verfasst: 10. April 2006 14:52
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.
Verfasst: 10. April 2006 15:48
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