QStackedWidget aktivieren

Alles rund um die Programmierung mit Qt
Antworten
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

QStackedWidget aktivieren

Beitrag von Irods »

Hi Leute.
Ich programmiere gerade ein Programm das mit Hilfe von ffmpeg
zum Konvertieren von Media-Dateien dienen soll.
Die Grundidee funktioniert auch schon gut.
Nun möchte ich allerdings wärend des Vorgangs der Kompilierung
Eine Komplett andere Oberfläche anzeigen um den Vorgang der Kompilierung
für den User zu Kommentieren.

Das versuche ich mit QStackedWidget.
Das Problem ist jetzt das ich es nicht schaffe bei QStackedWidget
den richtigen Index von einer Funktion ungleich MyConv aus einzustellen
Ich habe dies mittels setCurrentIndex und setCurrentWidget probiert so wie
mit einem im folgenden Quelltext auskommentierten SIGNAL-SLOT-System.

(Versuche von converting() aus dies zu tun)

Quellcode von MyConv.h

Code: Alles auswählen

#ifndef MYCONV_H
#define MYCONV_H
#include <QtGui>

class MyConv : public QMainWindow
{
	Q_OBJECT
	public:
		QStackedWidget *stack;
		MyConv(QMainWindow *parent = 0);
		QLineEdit* line;
		QStringList files;
		bool point;
		QTextEdit* edit;
	private:
		QPushButton* convert;
		QString directory;
	private slots:
		void openDirectory();
		void converting();
	signals:
		void changeSite(int wstack);
};
#endif
Quellcode von MyConv.cpp

Code: Alles auswählen

#include "MyConv.h"

MyConv::MyConv(QMainWindow *parent) : QMainWindow(parent)
{
	stack = new QStackedWidget;
	QMenu *dataMenu = new QMenu("&Data", this);
	dataMenu->addAction( QIcon(":images/data_icon.png"), "&Folder", this, SLOT(openDirectory()), QKeySequence("Ctrl+O") );
	menuBar()->addMenu(dataMenu);
	QHBoxLayout* hbox = new QHBoxLayout;
	QWidget *mainWidget = new QWidget;
	line = new QLineEdit("mp3");
	convert = new QPushButton("Convert");
	convert->hide();

	hbox->addWidget(line);
	hbox->addWidget(convert);
	mainWidget->setLayout(hbox);

	edit = new QTextEdit("loading...");

	stack->addWidget(mainWidget);
	stack->addWidget(edit);

//	connect( this, SIGNAL(changeSite(int)), stack, SLOT(setCurrentIndex(int)) );
	connect( convert, SIGNAL(clicked()), this, SLOT(converting()) );
	setCentralWidget(stack);
	setWindowTitle("Converter");
}

void MyConv::openDirectory()
{
	directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ":", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
	if(directory=="")
	{
		convert->hide();
	}
	else
	{
		convert->show();
		QDir dir(directory);
		dir.setFilter(QDir::Files);
		files = dir.entryList();
	}
}

void MyConv::converting()
{
//	emit changeSite(1);
	stack->setCurrentIndex(1);

	for(int i = 0; i<files.size(); ++i)
	{
		point=false;
		QString file;
		file.append(files.at(i));
		QString name;
		int i=0;
		while(file[i]!='.')
		{
			name.append(file[i]);
			i++;
			if(i==file.size())
			{
				point=true;
				break;
			}
		}
		if(point==false)
		{
			name=name+'.'+line->displayText();
			QString out = "ffmpeg -i \""+directory+"/"+file+"\" \""+directory+"/"+name+"\"";
			std::string stdout = out.toStdString();
			int t = system(stdout.c_str());
			t=t;
		}
	}
//	emit changeSite(0);
	stack->setCurrentIndex(0);
}
Weiss einfach nicht weiter, bitte um Hilfe, bin am Verzweifeln, mehr Worte fallen mir dazu gerade nicht ein xD

MfG Irods

PS: Fürs ausprobieren hier
main.cpp

Code: Alles auswählen

#include <QApplication>
#include "MyConv.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	MyConv* conv = new MyConv;
	conv->show();
	return app.exec();
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

1. warum system() und nicht was richtiges wie QProcess
2. und hier ist auch schon das Problem: http://linux.die.net/man/3/system
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed.
--> da Qt nie Zeit bekommt die eigene Eventloop abzuarbeiten kann Qt auch nichts zeichnen bzw. aktualisieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten