Neuling und leider im Alter etwas schwer von Begriff. Vorstellung

Cedric

Grünschnabel
Hallo Zusammen

Mein Name ich Cedric und ich komme aus der Schweiz.
Schon als 20 Jähriger versuchte ich mich im Programmieren.
Erst Basic, dann Pascal, und VB über JAVA und nun bin ich seit Monaten damit Beschäftigt C++ zu lernen.
Heute bin ich 46 Jahre Jung und begriffstutzig was Programmieren anbelangt.
Der Eine oder Andere wird mich jetzt etwas belächeln, aber das dürft ihr von mir aus auch tun. :)

Für das ich eigentlich überhaupt keine Ahnung habe, bin ich bis jetzt eigentlich erstaunlich weit gekommen.
Nur eben jetzt harkt es und ich bin schon seit Tagen am Googeln um mein Problem zu lösen.
Da ich kein Englisch kann, respektive sehr wenig, bin ich auf Hilde in Deutscher Sprache angewiesen.
Ich will damit nicht sagen, dass ich gut deutsch kann, nein auch da habe ich mit der Rechtschreibung so meine Mühe.
Aber da lasse ich mich auch nicht unter kriegen, denn da bin ich eine Kämpfernatur. :)

So nun zu meinem Problemchen.

Ich habe ein Fenster kreiert, in dem ich einen Button und ein lineedit eingesetzt habe.

Bei dem Button soll ich einen Festplatten Pfad auswählen, der mir das Arbeitsverzeichnis ausgeben und Speichern soll.
Später gibt es dann 2 Fenster, nennen wir die A und B.
Bei A kommt der Aktive und bei B der Passive Ordner aus dem Stammverzeichnis rein.
Je nachdem wo sich das andere Programm befindet, werden danach trotzdem Ordner A und B am richtigen Ort erscheinen, da bei jedem User danach diese Ordner gleich heissen und am gleichen Ort sich befinden.

Nun wenn ich mit dem Button der den Stammordner aussuchen will, klappt dies auch.
Nur wird dann im Lineedit fenster der Pfad nicht ausgewiesen und ich weiss auch nicht ob der Pfad danach gespeichert ist.

Mein Skript schaut so aus:

Main.cpp
Code:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

using namespace std;

int main()
{
    DIR *hdir;
    struct dirent *entry;

    hdir = opendir(".");
    do
    {
        entry = readdir(hdir);
        if (entry)
        {
            cout << entry->d_name << endl;
        }

     } while (entry);
    closedir(hdir);
}

Und:
Mainwindow.cpp
Code:
void MainWindow::on_pushButton_2_clicked()
{


    BROWSEINFO anzeigen;
    memset( &anzeigen, 0, sizeof( BROWSEINFO ) );
    anzeigen.ulFlags = BIF_RETURNONLYFSDIRS;

    ITEMIDLIST* browser = SHBrowseForFolder( &anzeigen );
    if( browser ) {

    }


 }

void MainWindow::on_lineEdit_selectionChanged()
{
    QCoreApplication::applicationDirPath();
}

Die Includs habe ich gemacht und jetzt bin ich da am grübeln und suchen.
Jedoch obwohl dies ja oft gebraucht wird, habe ich bis jetzt nichts darüber gfunden.

Hoffentlich kann einer von Euch einem angehenden Greisen mal unter die Arme greiffen. :)

Recht herzlichen Dank fürs ernst nehmen.

Liebe Grüsse

Cedric
 
Hallo,
und herzlich willkommen bei tutorials.de!

Ich hoffe, ich habe dein aktuelles Problem richtig verstanden: Nach Auswahl eines Ordners willst du diese Auswahl in einem QLineEdit anzeigen und außerdem noch irgendwie speichern?

Nach Auswahl mit SHBrowseForFolder musst du den gewählten Pfad noch aus der Datenstruktur herausziehen. Das passiert mit SHGetPathFromIDList. Den Code habe ich dir weiter unten aufgeschrieben. Die Zuweisung an das Edit-Control erfolgt mit der Methode "setText()" vom QLineEdit. Da ich deine Vraiablennamen ( das UI::... - Objekt und das QLineEdit-Objekt) nicht kenne, kann ich dir diese Zeile nicht aufschreiben.
C++:
void MainWindow::on_pushButton_2_clicked()
{
    BROWSEINFO anzeigen;
    memset( &anzeigen, 0, sizeof( BROWSEINFO ) );
    anzeigen.ulFlags = BIF_RETURNONLYFSDIRS;
 
    ITEMIDLIST* browser = SHBrowseForFolder( &anzeigen );
    if( browser )
    {
        char lpBuffer[MAX_PATH];
        
        if( SHGetPathFromIDList(&browser, lpBuffer) )
        {
            // TODO: Zuweisung an LineEdit        
        }
    }
 }

Was du mit "on_lineEdit_selectionChanged" bezweckst ist mir nicht ganz klar. Zum einen warum du auf dieses Signal reagieren willst und zum anderen ist der Aufruf von "QCoreApplication::applicationDirPath();" ziemlich sinnfrei. Diese Methode gibt den Pfad der EXE zurück, der allerdings von dir nicht verarbeitet wird.

Noch ein Tipp: Benutze bitte aussagekräftige Titel für deine Fragen. Ein kurzer Stichpunkt zum Problem und auch die Info, dass du mit Qt arbeitest wären angebracht gewesen.

Gruß
MCoder
 
Ich sehe in deinem code nirgends das initialisieren von (D)COM.

Um SHBrowseForFolder benutzen zu können, muss der thread in dem du es aufrufst COM initialisiert haben, sonst schlägt der aufruf fehl.

You must initialize Component Object Model (COM) before you call SHBrowseForFolder. If you initialize COM using CoInitializeEx, you must set the COINIT_APARTMENTTHREADED flag in its dwCoInit parameter. You can also use CoInitialize or OleInitialize, which always use apartment threading. If you require drag-and-drop functionality, OleInitialize is recommended because it initializes the required OLE as well as COM.

Code:
HRESULT r = OleInitialize();
if(r != S_OK) {
    MessageBoxW(NULL, "Failed to initialize OLE/COM", "Error", MB_OK);
    exit(-1);
}
.....

Nicht vergessen OleUninitialize(); bevor das Programm beendet wird
 
Hallo Zusammen

@MCoder:
Recht herzlichen Dank für Deine so schnelle Antwort.
Man bin ich ein Dödel, habe ich die ganze Zeit wärend ich meinen Beitrag geschrieben habe, daran gedacht zu erwähnen das ich mit QT4 arbeite. :)
Ich werde mal in meinen 4 Bücher die ganzen Änderungen von Dir nach lesen.

@chibisuke:

Danke auch für Deine schnelle Antwort.
werde mal rätzseln, wo ich das inizialisieren wie in deinem Beispiel rein kommt, hab ja geschrieben das ich der Englischen Sprache nicht mächtig bin und daher kann ich mit dem Text in der Sprechblase eher weniger anfangen. :-(

Gut ich bin ja eine Kämpfernatur und irgendwie werde ich dies auch noch in die Reihe bekommen.

Danke Euch Beiden veroerst mal für Eure Hilfe und ich werde die Erfolge dann hier rein tippen. :)

Schönes Wochenende gewünscht.

Liebe Grüsse

Cedric

----------------
Arbeite mit QT4
 
Hallo,
und herzlich willkommen bei tutorials.de!

Ich hoffe, ich habe dein aktuelles Problem richtig verstanden: Nach Auswahl eines Ordners willst du diese Auswahl in einem QLineEdit anzeigen und außerdem noch irgendwie speichern?

Ja das hast Du richtig verstanden.

Die Zuweisung an das Edit-Control erfolgt mit der Methode "setText()" vom QLineEdit. Da ich deine Vraiablennamen ( das UI::... - Objekt und das QLineEdit-Objekt) nicht kenne, kann ich dir diese Zeile nicht aufschreiben.

Genau da beginnt mein Problem.
Ich habe alles noch nie verstanden und so wie dies ausschaut werde ich dies wohl auch nie verstehen.
Ich verstehe nicht einmal diesen Zitierten Teil wirklich. :-(

Was du mit "on_lineEdit_selectionChanged" bezweckst ist mir nicht ganz klar. Zum einen warum du auf dieses Signal reagieren willst und zum anderen ist der Aufruf von "QCoreApplication::applicationDirPath();" ziemlich sinnfrei. Diese Methode gibt den Pfad der EXE zurück, der allerdings von dir nicht verarbeitet wird.

Das war einer meiner unwissenden Versuche mein Problem zu lösen, bevor ich mir allen Mut zusammen genommen hatte meine Frage in einem Forum zu posten.

Ich habe in vielen Foren Neulingsberichte und anfragen gefunden und gelesen.

Meistens hatte ich aber dann meinen Kopf gesenkt und war sehr traurig, wie man in gewissen Foren mit neu Einsteigern umgeht.
Aussagen wie " Versuche mal das Handbuch zu lesen, oder lies doch erst mal ein Handbuch, bevor Du versuchst etwas zu programmieren, dass Du nie verstehen wirst."

Solche Aussagen hatten mir oft den Mut genommen endlich mal klar Schiff zu machen und mein Problem zu erläutern.
Mehr als eine Woche, habe ich in meinem Urlaub Handbücher gewälzt und gelesen, stundenlang, aber leider nur das wenigste behalten können. :-(

Ich bin mir sicher, dass viele der Jungs und vielleicht auch Maedels dies auch gemacht hatten.

Klar jemandem etwas via Text bei zu bringen ist nur den Wenigsten gegeben und sicher für den User der hilft sowie auch dem der um Hilfe ersucht eine Nervensache, da der Fragende wie auch bei mir etwas vergessen ging zu erwähnen wie mit welcher C++ Software man es versucht etc.

Gegenseitig dann wieder die Erwartung des Hilfeleistenden über eine gewisse Vorkenntnis des Fragenden.

So kommen immer wieder viele Aspekte zusammen, die für jene wie ich es bin, (Begriffstutzig) die trotz Hilfe einfach da stehen wie bestellt und nicht abgeholt.

Zum Hinweis von chibisuke mit der Initialisierung von COM musste ich auch gleich wieder meine 4 Bücher zur Hand nehmen und wie schon vorher suchen, suchen und wieder suchen.

Fündig aber wurde ich wiederum noch nicht und ich habe bald das Gefühl, dass in den Bücher sehr viel behandelt wird, nur einfach nicht das was man wirklich als Einsteiger benötigt.
Nicht einmal das Buch C++ für Dummies ist so verfasst, dass man es versteht. :-(

Klar ich könnte alle meine 4 Listings hier rein stellen und das Problem ist vielleicht gelöst, aber es würde mein Problem nicht lösen.

Ich hatte auch schon daran gedacht einen Einsteiger Kurs zu machen, aber diese sind in der Schweiz schweine Teuer und zu dem wäre dies für mich wohl nur Geld das ich danach aus dem Fenster geworfen hätte, da gehe ich lieber jetzt eine Curry Wurst essen und geniesse mal die Sonne.

Sorry Jungs für meine Klageworte, aber jetzt fühle ich mich wohler.

Noch ein Tipp: Benutze bitte aussagekräftige Titel für deine Fragen. Ein kurzer Stichpunkt zum Problem und auch die Info, dass du mit Qt arbeitest wären angebracht gewesen.

Gruß
MCoder
Jep das ist voll klar, aber ich dachte, da ich mich vorerst Vorstellte sei mein Titel so auch gut dazu. :)
Das mit QT4 war eindeutig ein Versäumnis meinerseit.

Und noch einmal, danke für Eure Hilfe, die ist eindeutig besser als mein Beklagtes von vorher.
Da bin ich sicher beim richtigen Forum gelanet. :)

Liebe Grüsse

Cedric
 
Hallo Cedric,

was ich noch anmerken wollte: Mit deinem jugendlichen Alter brauchst du dich hier gar nicht herauszureden :D

Mit welcher Entwicklungsumgebung arbeitest du denn eigentlich? Wenn du mit dem Qt-Framework arbeitest und damit zumindest schon mal ein Fenster auf den Bildschirm gebracht hast, hast du wahrscheinlich auch eine gewisse Unterstützung, also automatisch generierten Code, durch die Entwicklungsumgebung erhalten. In diesen Code stecken Informationen drinnen, die du für die weitere Arbeit benötigst.

Da du die GUI vermutlich im Designer erstellt hast, benötigst du den dort vergebenen Namen für das Editfeld. Poste doch mal den Konstruktor von deinem MainWindow. Dort sollte erkennen können, wie die GUI initialisiert wird und ich kann dir sagen, wie 'setText()' aufgerufen wird.

Da sich der Ordnerauswahldialog wohl schon öffnet, ist die COM-Initialisierung erstmal nicht das vordergründige Problem.

Gruß
MCoder
 
Antwort dritter Versuch. :-(

Also noch mal von Vorne.

Hallo MCoder, man habe ich immer Mühe Menschen mit Pseudonamen an zu schreiben.
Darf ich Dich Larry nennen? (Siehe dein Zitat) So fällt mir die Kommunikation etwas einfacher. Danke

Also in dem Falll habe ich Deine Antwort schon kurz nach 18.00 Uhr gesehen und gelesen.
Aber ich bin eher der Typ, der dann erst mal ausprobiert und sucht und Bücher wältzt um vielleicht alles zu lernen und vieleicht auch zu verstehen, wie die Zusammenhänge sind.
Es bringt mir nicht viel, wenn ich dann jeden Code auf dem Silbertablet serviert bekomme.
Also hatte ich erst mal was gegessen und in die Glotze geschaut.
Nach 22.15 Uhr setzte ich mich dann wieder hinter mein PRogrämmchen und Bücher um etwas von deinem letzten Beitrag zu erhaschen.
Natürlich probierte ich auch diverses aus.

Natürlich hatte ich kein Erfolgserlebnis ausser vielleicht wenn ich Dir aus der Richtigen Datei den Code anzeige.

Also wenn ich Dich richtig verstanden habe, so meitest Du den folgenden Code Auszug aus der Datei:
MainWindow.ui

Ui.MainWindows.ui
Code:
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QScrollArea>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QScrollArea *scrollArea;
    QWidget *scrollAreaWidgetContents;
    QScrollArea *scrollArea_2;
    QWidget *scrollAreaWidgetContents_2;
    QLineEdit *lineEdit;
    QPushButton *pushButton;
    QLineEdit *lineEdit_2;
    QPushButton *pushButton_2;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(683, 667);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        scrollArea = new QScrollArea(centralWidget);
        scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
        scrollArea->setGeometry(QRect(20, 130, 261, 471));
        scrollArea->setWidgetResizable(true);
        scrollAreaWidgetContents = new QWidget();
        scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
        scrollAreaWidgetContents->setGeometry(QRect(0, 0, 259, 469));
        scrollArea->setWidget(scrollAreaWidgetContents);
        scrollArea_2 = new QScrollArea(centralWidget);
        scrollArea_2->setObjectName(QString::fromUtf8("scrollArea_2"));
        scrollArea_2->setGeometry(QRect(320, 130, 241, 471));
        scrollArea_2->setWidgetResizable(true);
        scrollAreaWidgetContents_2 = new QWidget();
        scrollAreaWidgetContents_2->setObjectName(QString::fromUtf8("scrollAreaWidgetContents_2"));
        scrollAreaWidgetContents_2->setGeometry(QRect(0, 0, 239, 469));
        scrollArea_2->setWidget(scrollAreaWidgetContents_2);
        lineEdit = new QLineEdit(centralWidget);
        lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
        lineEdit->setGeometry(QRect(32, 40, 511, 21));
        pushButton = new QPushButton(centralWidget);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));
        pushButton->setGeometry(QRect(571, 577, 75, 23));
        lineEdit_2 = new QLineEdit(centralWidget);
        lineEdit_2->setObjectName(QString::fromUtf8("lineEdit_2"));
        lineEdit_2->setGeometry(QRect(28, 87, 171, 20));
        pushButton_2 = new QPushButton(centralWidget);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
        pushButton_2->setGeometry(QRect(550, 40, 111, 23));
        pushButton_2->setDefault(false);
        pushButton_2->setFlat(false);
        MainWindow->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 683, 21));
        MainWindow->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QString::fromUtf8("statusBar"));
        MainWindow->setStatusBar(statusBar);
        QWidget::setTabOrder(scrollArea, scrollArea_2);
        QWidget::setTabOrder(scrollArea_2, pushButton);
        QWidget::setTabOrder(pushButton, pushButton_2);
        QWidget::setTabOrder(pushButton_2, lineEdit_2);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
        lineEdit->setToolTip(QString());
#endif // QT_NO_TOOLTIP
        pushButton->setText(QApplication::translate("MainWindow", "Beenden", 0, QApplication::UnicodeUTF8));
        pushButton_2->setText(QApplication::translate("MainWindow", "Open X-Plane Pfad", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

Wenn dies der Auszug ist, den Du meintest, so hatte ich dann doch ein Erfolgserlebnis. :)

Jetzt wünsche ich Direinen schönen Samstag und danke für Deine Hilfe.

Liebe Grüsse
Cedric
 
Zuletzt bearbeitet:
Ich halt schon wieder.

Larry ich weiss nicht ob ich der Geborene Programmierer bin, aber so wie es aussaut eher nicht oder QT4 ist nur Profis gedacht und nicht für mich.

Mit dieser Fehlermeldung kann ich nichts aber auch gar nichts anfangen und wenn man im QT4 Designer dann erhoft mit F1 auch eine Antwort zu bekommen, meldet es einfach Kein eDokumentation verfügbar

Das kommt wenn ich Dein im ersten Beitrag eingefügen Code benutze.
Code:
..\My-Scenery-finder\mainwindow.cpp:54: error: 
cannot convert 'ITEMIDLIST**' to 'const ITEMIDLIST*' for argument '1' to 'BOOL 
SHGetPathFromIDListW(const ITEMIDLIST*, WCHAR*)'

Ich gehe ein kaufen, denn wenn der Wagen voll ist, habe ich 50€ ausgegeben, auch ohne C++

Gruss
Cedric
 
Hallo Cedric,

es wäre wohl am einfachsten, wenn du den Ordnerdialog auch über Qt erzeugst und nicht (wie bisher) direkt auf die Windows-API zurückgreifst. Das sähe dann z.B. so aus:

C++:
#include <QFileDialog> // Diese Zeile am besten an den Anfang der Datei!

void MainWindow::on_pushButton_2_clicked()
{
    QString pfad = QFileDialog::getExistingDirectory(this);
    if (!pfad.isEmpty()) {
        lineEdit->setText(pfad);
    }
}

Grüße,
Matthias
 
Hallo Cedric,

der Fehler beruht auf einem Tippfehler meinerseits, so ist es richtig:
C++:
 if( SHGetPathFromIDList(browser, lpBuffer) )
'browser' ist schon ein Zeiger, da braucht's den '&'-Operator nicht. Oder du verwendest die Lösung von Matthias Reitinger und arbeitest damit durchgängig mit Qt.

Aus der 'Ui.MainWindows.ui' kann man schon entnehmen, das die Variable für das Editfeld 'lineEdit' heißt. Was jetzt noch fehlt ist der Name des Objekts der Klasse 'Ui_MainWindow', das in der MainWindow.h deklariert ist.

Gruß
MCoder
 

Neue Beiträge

Zurück