Seite 1 von 1

QListwidget auslesen, CreateToolhelp32Snapshot Typumwandlung

Verfasst: 10. September 2007 22:19
von xbbb
Hallo liebe Gemeinde!
Bin neu auf dem Gebiet QT-Programmiering und habe zwei fragen:

1.)Wie kann ich die Liste aus einem QListWidget auslesen und in eine Datei speichern. (Liste enthält Processnamen, eingefügt als new QListwidgetItem(process, procListe))

2.)Ich lese die Processnamen mit hilfe von
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32* process=new PROCESSENTRY32;
process->dwSize=sizeof(PROCESSENTRY32);

und möchte alle Laufende processe ebenfalls in einem QListWidget anzeigen lassen.

while(Process32Next(hSnapShot,process)!=FALSE)
{
new QListWidgetItem(process->szExeFile, currentList);
}

Das Problem dabei ist, dass die Datentypen nicht zusammenpassen und ich eine Fehlermeldung bekomme "error C2664: 'QListWidgetItem::QListWidgetItem(QListWidget *,int)': Konvertierung des Parameters 1 von 'WCHAR [260]' in 'QListWidget *' nicht moglich"

Bitte, wenn möglich schreibt eure vorschläge als Codebeispiele, da ich wie gesagt noch ein Anfänger bin.
Danke im Voraus!

Re: QListwidget auslesen, CreateToolhelp32Snapshot Typumwand

Verfasst: 11. September 2007 07:26
von macman
xbbb hat geschrieben:Konvertierung des Parameters 1 von 'WCHAR [260]' in 'QListWidget *' nicht moglich"
Du bist nicht nur Qt-Anfänger, sondern überhaupt Anfänger, sonst könntest Du mit der Meldung was anfangen :-) Ich empfehle dir ein durcharbeiten der Tutorials, das sollte etwas bei den Grundlagen helfen.

Verfasst: 11. September 2007 07:40
von Christian81
Und dann würde ich in der Doku mir mal QString und dort speziell fromUtf16() anschauen.

Verfasst: 11. September 2007 14:07
von xbbb
Ja, ihr habt recht, ich bin überhaupt ein Anfänger. Na und? Darf einem Anfänger nicht geholfen werden?
Ich bin ein Student und versuche etwas zu lernen.

Mit der Fehlermeldung kann ich schon was anfangen. Ich weiss, dass QListWidget einen QString braucht und mit wchar nichts anfangen kann, aber ich weiss nicht wie ich das Problem löse.

Die Tutorials habe ich längst gelesen, zum wchar[260] steht da nichts.

Und auch zu Frage 1. würde ich gerne etwas hören. Welche Funktion brauche ich zum auslesen von Items aus QListwidget.

Paar code snippets würden sehr helfen.
Danke!

P.S. Danke Christian ich werde es mir anschauen. Warum bist du so sicher das ich genau from utf16 brauche?

Verfasst: 11. September 2007 14:18
von Christian81
Weil WCHAR genau das ist. WCHAR = 2Byte = utf16-Kodierung

Verfasst: 11. September 2007 14:19
von macman
xbbb hat geschrieben:Ich weiss, dass QListWidget einen QString braucht und mit wchar nichts anfangen kann, aber ich weiss nicht wie ich das Problem löse.
So müsste es gehen.

Code: Alles auswählen

while(Process32Next(hSnapShot,process)!=FALSE)
{
    new QListWidgetItem(QString::fromUtf16((const ushort*)process->szExeFile), currentList);
} 
xbbb hat geschrieben:Welche Funktion brauche ich zum auslesen von Items aus QListwidget.
Ein einzelnes Item bekommst Du mit:
QListWidgetItem * currentItem () const
und eine Liste mit:
QList<QListWidgetItem *> findItems ( const QString & text, Qt::MatchFlags flags ) const
Wie Du an den Inhalt eines Items kommst, findest Du in der QListWidgetItem Class Reference.
Assistant hat geschrieben:QString QListWidgetItem::text () const
Returns the list item's text.

Verfasst: 11. September 2007 21:56
von xbbb
Danke für die schnelle Antwort.
Es klappt super mit dem fromutf16! Es hat mir sehr geholfen.

Ich komme aber immer noch nicht klar mit dem QListWidgetItem. Denn currentItem() gehört nicht zu QListWidgetItem sondern zu QListWidget. Ich habe es schon so und so gedreht aber bekomme nichts raus.

Was ich eigentlich will ist nur ein ausgewähltes Item aus dem QListWidget des ersten Dialogfensters durch einen Buttonclick in das QListWidget des zweten Dialogfensters einfügen.

Bild

void currentDialog::on_okButton_clicked()
{
was kommt hier rein?
}

Danke!

Verfasst: 12. September 2007 07:17
von macman
Ungefähr so:

Code: Alles auswählen

void currentDialog::on_okButton_clicked()
{
    pAndererDialog->listWidget->addItem(new QListWidgetItem(listWidget->currentItem()));
}

Verfasst: 12. September 2007 15:55
von xbbb
Geht leider nicht :(
Es ist jetzt ganz komisch, der zeigt mir Syntaxfehler es fehlt ';' vor '->' und zwar doppelt :shock:
wo soll denn das ; hin?
Ich doch alles richtig eingegeben, in meinem Fall sieht's so aus:
void currentDialog::on_okButton_clicked()

Code: Alles auswählen

{ 
    processterminator->terminationList->addItem(new QListWidgetItem(currentList->currentItem())); 
}
hier ist der currentdialog.cpp für den Fall der Fälle:

Code: Alles auswählen

#include "currentdialog.h"
#include "processterminator.h"
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <QString>
#include <QListWidget>
#include <QListWidgetItem>

currentDialog::currentDialog(QWidget *parent)
	: QDialog(parent)
{
	setupUi(this);

    HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
		PROCESSENTRY32* process=new PROCESSENTRY32; 
		process->dwSize=sizeof(PROCESSENTRY32); 
	while(Process32Next(hSnapShot,process)!=FALSE) 
	{
		new QListWidgetItem(QString::fromUtf16(process->szExeFile), currentList); 
	}

	CloseHandle(hSnapShot);
}

currentDialog::~currentDialog()
{

}

void currentDialog::on_okButton_clicked()
{
	processterminator->terminationList->addItem(new QListWidgetItem(currentList->currentItem()));
}

Verfasst: 12. September 2007 16:04
von macman
xbbb hat geschrieben:Es ist jetzt ganz komisch, der zeigt mir Syntaxfehler es fehlt ';' vor '->' :shock:
Dann kennt er den processterminator oder die terminationList nicht. Kann auch sein das einfach ein ui dazwischen fehlt, also

Code: Alles auswählen

{
    processterminator->ui.terminationList->addItem(new QListWidgetItem(currentList->currentItem()));
}

Verfasst: 12. September 2007 17:40
von xbbb
macman hat geschrieben:Kann auch sein das einfach ein ui dazwischen fehlt, also

Code: Alles auswählen

{
    processterminator->ui.terminationList->addItem(new QListWidgetItem(currentList->currentItem()));
}
Den Verdacht hatte ich auch, aber daran liegt es nicht. Ich habe das ui. schon überall reingeschteckt, bringt nichts.
macman hat geschrieben:Dann kennt er den processterminator oder die terminationList nicht.
Wie kennt er nicht? Wie soll er die "kennenlernen"?
Srry für blöde Fragen, aber ich bin einfach am verzweifeln.

Verfasst: 12. September 2007 19:50
von Christian81
Ich glaube das gehört jetzt in C++ für Anfänger und nicht in ein Qt-Forum...
Irgendwo müssen die Variablen ja deklariert werden, oder?

Verfasst: 12. September 2007 21:18
von xbbb
Das weiß ich. Alles ist deklariert.
Ich benutze MSVS-Integration und Designer, dabei wird eigentlich alles automatisch deklariert. Es würde ja nichts funktionieren, wenn die Variablen nicht deklariert wären, es geht aber alles außer diesem Einfügen eines Eitems von Liste zu Liste.

Soll ich das ganze Projekt online stellen damit ihr es euch angucken könnt?

Verfasst: 14. September 2007 18:21
von xbbb
So, hier sind die Quelltexte von meinem Projekt. Vielleicht findet doch einer am Wochenende Paar Minuten und sagt mir wo der Fehler liegt. Ich habe sonst niemandem zum Fragen :(

Der Fehler zeigt er im currentdialog.cpp in Funktion void currentDialog::on_okButton_clicked()

main.cpp

Code: Alles auswählen

#include <QtGui/QApplication>
#include "processterminator.h"

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	processterminator w;
	w.show();
	a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
	return a.exec();
}
processterminator.cpp

Code: Alles auswählen

#include "processterminator.h"
#include "currentdialog.h"
#include <QFileDialog>
#include <QString>
#include <QDir>
#include <QFile>

processterminator::processterminator(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
}

processterminator::~processterminator()
{

}


void processterminator::on_addButton_clicked()
{
QFileInfo path(ui.processEdit->text());
    QString process = path.fileName();
             
             if (!process.isEmpty()) {
                     new QListWidgetItem(process, ui.terminationList);
			 }
			 ui.processEdit->clear();
}

void processterminator::on_deliteButton_clicked()
{
	delete ui.terminationList->currentItem();
}

void processterminator::on_pathButton_clicked()
{
QString path = QFileDialog::getOpenFileName(this,
     tr("Select File"), "/", tr("Executable Files (*.exe)"));
if (!path.isEmpty()) {
	ui.processEdit->setText(path);
     }
}

void processterminator::on_currentButton_clicked()
{
currentDialog dialog(this); 
dialog.exec();
}

currentdialog.cpp

Code: Alles auswählen

#include "currentdialog.h"
#include "processterminator.h"
#include <windows.h>
#include <tlhelp32.h>
#include <QString>
#include <QListWidget>
#include <QListWidgetItem>

currentDialog::currentDialog(QWidget *parent)
	: QDialog(parent)
{
	setupUi(this);

    HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
		PROCESSENTRY32* process=new PROCESSENTRY32;
		process->dwSize=sizeof(PROCESSENTRY32);
	while(Process32Next(hSnapShot,process)!=FALSE)
	{
		new QListWidgetItem(QString::fromUtf16(process->szExeFile), currentList);
	}

	CloseHandle(hSnapShot);
}

currentDialog::~currentDialog()
{

}

void currentDialog::on_okButton_clicked()
{
      processterminator->ui.terminationList->addItem(new QListWidgetItem(currentList->currentItem()));  //hier zeigt er den Fehler
}
currentdialog.h

Code: Alles auswählen

#ifndef CURRENTDIALOG_H
#define CURRENTDIALOG_H

#include <QDialog>
#include "ui_currentdialog.h"

using namespace Ui;

class currentDialog : public QDialog, public currentDialogClass
{
	Q_OBJECT

public:
	currentDialog(QWidget *parent = 0);
	~currentDialog();


private slots:
	void on_okButton_clicked();
};

#endif // CURRENTDIALOG_H
processterminator.h

Code: Alles auswählen

#ifndef PROCESSTERMINATOR_H
#define PROCESSTERMINATOR_H

#include <QtGui/QMainWindow>
#include "ui_processterminator.h"

class processterminator : public QMainWindow
{
	Q_OBJECT

public:
	processterminator(QWidget *parent = 0, Qt::WFlags flags = 0);
	~processterminator();

private:
	Ui::processterminatorClass ui;

private slots:
	void on_saveButton_clicked();
	void on_currentButton_clicked();
	void on_pathButton_clicked();
	void on_deliteButton_clicked();
	void on_addButton_clicked();
};

#endif // PROCESSTERMINATOR_H

Verfasst: 17. September 2007 07:17
von macman
Wo wird denn in deinem currentDialog der processterminator deklariert? Steht doch nirgends. Glaubst Du der kennt den, nur weil Du das Headerfile includierst?