Seite 1 von 1

Widget und Dialog getrennt starten?

Verfasst: 18. Juni 2012 12:29
von tja
Hallo Zusammen,
ich bin ein Anfänger in Sachen Qt-Programmierung und hoffe, Ihr könnt mir ein wenig helfen.

Ich habe folgende Aufgabe/Problem und habe aktuell keine Idee, wie man das realisieren könnte: Ich habe zwei Fenster, einmal ein QWidget (MainWidget) und einmal ein QDialog (ShowFrame). Im MainWidget soll der Benutzer über drei Checkboxen einstellen können, welche Programmfeatures genutzt werden sollen (Sound, Netzwerk etc). Desweiteren soll der Benutzer ein bestimmtes Verzeichnis wählen, in dem sich einige Bilder befinden.
Im ShowFrame (QDialog) sollen dann die ausgewählten Bilder angezeigt werden. Das ganze funktioniert bis hierhin ganz gut, jedoch habe ich folgendes Problem:

Die Klasse ShowFrame soll zwei Funktionen, nextFrame() und prevFrame() für das gesamte Projekt bereitstellen. Bisher wird ShowFrame jedoch erst im MainWidget nach einem Click auf einen Button erzeugt (somit stehen die Funktionen auch nur dem MainWidget zur Verfügung).

Die Idee ist jetzt: MainWidget starten, Einstellungen machen, Pfad auswählen und MainWidget wieder beenden. Erst dann ShowFrame mit den gemachten Einstellungen und dem Pfad starten (aus der Main.cpp). Nur wie kann man das ganze realisieren? Ich habe mal den bisherigen Code eingefügt.

main.cpp

Code: Alles auswählen

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

    MainWidget w;

    w.show();
    return a.exec();
}
mainwidget.cpp

Code: Alles auswählen

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::setFrameList()
{
    files = directory.entryList(QDir::Files);
    ui->listWidget->addItems(files);
    ui->pathLabel->setText(directory.absolutePath()+"/"+files.at(2));
}

void MainWidget::chooseFileHandler()
{
    path = QFileDialog::getExistingDirectory (this, tr("Directory"), directory.path());
       if ( path.isNull() == false )
       {
           directory.setPath(path);
           ui->pathLabel->setText(path);
           setFrameList();
           ui->pushButton->setEnabled(true);
       }
}

QString MainWidget::getPath()
{
    return path;
}

void MainWidget::showImageframe()
{
    showFrame *f = new showFrame();
    f->setFrameList(path);

    f->show();
}
mainwidget.h

Code: Alles auswählen

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QFileDialog>
#include <QDir>
#include "showframe.h"

namespace Ui {
class MainWidget;
}

class MainWidget : public QWidget
{
    Q_OBJECT
    
public:
    explicit MainWidget(QWidget *parent = 0);
    ~MainWidget();
    void setFrameList();
    QString getPath();

public slots:
    void chooseFileHandler();
    void showImageframe();
    
private:
    Ui::MainWidget *ui;
    QDir directory;
    QString path;
    QStringList files;
};

#endif // MAINWIDGET_H
showframe.cpp

Code: Alles auswählen

#include "showframe.h"
#include "ui_showframe.h"

showFrame::showFrame(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::showFrame)
{
    ui->setupUi(this);
}

showFrame::~showFrame()
{
    delete ui;
}

void showFrame::setFrameList(QString path)
{
    this->path = path;
    directory.setPath(path);
    files = directory.entryList(QDir::Files);
    index = 0;

    QImage image(directory.absolutePath()+"/"+files.at(0));
    ui->labelImage->setPixmap(QPixmap::fromImage(image));
    //ui->labelImage->setText(directory.absolutePath()+"/"+files.at(0));
}

void showFrame::prevFrame()
{
    if (index > -1)
    {
        index--;
    }


    if (index < 0)
    {
        ui->labelImage->setText("Begin of presentation!");
    } else
    {
        QImage image(directory.absolutePath()+"/"+files.at(index));
        ui->labelImage->setPixmap(QPixmap::fromImage(image));
    }

}

void showFrame::nextFrame()
{
    if (index < files.size())
    {
        index++;
    }

    if (index > files.size()-1)
    {
        ui->labelImage->setText("End of presentation!");
    } else
    {
        QImage image(directory.absolutePath()+"/"+files.at(index));
        ui->labelImage->setPixmap(QPixmap::fromImage(image));
    }
}
showframe.h

Code: Alles auswählen

#ifndef SHOWFRAME_H
#define SHOWFRAME_H

#include <QDialog>
#include <QDir>

namespace Ui {
class showFrame;
}

class showFrame : public QDialog
{
    Q_OBJECT
    
public:
    explicit showFrame(QWidget *parent = 0);
    ~showFrame();
    void setFrameList(QString path);

public slots:
    void prevFrame();
    void nextFrame();
    
private:
    Ui::showFrame *ui;
    QString path;
    QDir directory;
    QStringList files;
    int index;
};

#endif // SHOWFRAME_H

Re: Widget und Dialog getrennt starten?

Verfasst: 18. Juni 2012 17:22
von tja
Kurzes Update:

Ich habs jetzt so gelöst, dass ich dem Konstruktor von MainWidget ein Objekt auf eine Instanz von ShowFrame als Parameter übergebe. Scheint zwar nicht schön zu sein, funktioniert aber.

Main.cpp

Code: Alles auswählen

   
 f = new showFrame(0);
 w = new MainWidget(0, f);
In der MainWidget.cpp wird das ganze dann nur noch zugeordnet:

Code: Alles auswählen

MainWidget::MainWidget(QWidget *parent, showFrame *myShowFrame) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    f = myShowFrame;
}