Seite 1 von 1

QStackedWidget aktivieren

Verfasst: 13. März 2010 12:26
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();
}

Verfasst: 14. März 2010 09:43
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.