2015-07-27 5 views
0

Je fais une application qui va pouvoir programmer ma carte. Je voudrais sélectionner le fichier via la boîte de dialogue de fichier et de téléchargement avec le fichier sélectionné par le bouton de téléchargement. J'ai deux classes: MyFileDialog et CommandProcess. J'ai connecté le signal cliqué sur le bouton de téléchargement au mappeur de signal et je l'ai mappé au slot CommandProcess :: startProcess, qui exécute le processus avec le chemin du fichier sélectionné mais le chemin est incorrect si je ne l'indique pas au démarrage du programme. Comment puis-je mettre à jour le paramètre de mappage après avoir choisi le fichier?QSignalMapper ne met pas à jour le paramètre après avoir choisi le fichier

Une partie du code main.cpp:

QObject *uploadButton = mainForm->findChild<QObject*>("uploadButton"); 

QSignalMapper mapper; 
ConsoleProcess proc; 
MyFileDialog mfd; 

QObject::connect(fileButton, SIGNAL(clicked()), &mfd, SLOT(openMyFileDialog())); 
QObject::connect(uploadButton, SIGNAL(clicked()), &mapper, SLOT(map())); 
mapper.setMapping(uploadButton, mfd.getFilename()); 
QObject::connect(&mapper, SIGNAL(mapped(const QString &)),&proc, SLOT(startProcess(const QString &))); 

classe MyFileDialog:

public: 
    MyFileDialog(); 
    QString getFilename(); 

private: 
    QFileDialog fd; 

public slots: 
    void openMyFileDialog(); 

QString MyFileDialog::getFilename() { 
    return fd.getOpenFileName(); 
} 

classe ConsoleProcess:

private: 
    QProcess p; 

public: 
    ConsoleProcess(); 

public slots: 
    void startProcess(const QString &); 

void ConsoleProcess::startProcess(const QString & path) { 
    p.setWorkingDirectory("C:/avrdude"); 
    p.start("cmd.exe /C start avrdude.exe -c breakout -P ft0 -p m2560 -U flash:w:\"" + path + "\":a"); 
} 
+0

Êtes-vous sûr que vous avez besoin de ce 'QSignalMapper'? Vous pouvez ouvrir fileDialog, chech si le fichier existe et appeler 'Proc :: startProcess()' avec l'argument de chemin de fichier –

+1

Ou d'une autre manière - pour stocker le chemin du fichier chosed dans le membre de la classe 'MyFileDialog' –

+0

Cela peut être utile, devrais-je stocker le chemin après le bouton de téléchargement cliqué signal? – sochinho

Répondre

1

Vous pouvez créer 2 emplacements à votre classe MainWindow et QString membre pour stocker le chemin vers le fichier comme ceci:

class MainWindow : public QMainWindow, private Ui::MainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 

public slots: 
    void choseSlot(); 
    void uploadSlot(); 

private: 
    QString m_file; 

}; 

Créer des connexions à votre classe constructeur et initialiser m_file variable:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), m_file(QString()) 
{ 
    setupUi(this); 

    connect(choseFile, SIGNAL(clicked(bool)), this, SLOT(choseSlot())); 
    connect(uploadFile, SIGNAL(clicked(bool)), this, SLOT(uploadSlot())); 
} 

Ensuite, le temps de réaliser les fentes décrites. Sortons QFileDialog::getOpenFileName résultat de la méthode statique:

void MainWindow::choseSlot() 
{ 
    m_file = QFileDialog::getOpenFileName(this, tr("Open file"), QDir::currentPath(), tr("Some Files (*.a *.b *.c)")); 
} 

Et si le fichier déjà choisi à l'emplacement de téléchargement, nous pouvons les tranférer ou faire ce que vous voulez:

void MainWindow::uploadSlot() 
{ 
    if (!m_file.isEmpty()) { 
     qDebug() << Q_FUNC_INFO << m_file; 
     QProcess *prc = new QProcess; 
     connect(prc, SIGNAL(finished(int)), prc, SLOT(deleteLater())); 
     prc->setWorkingDirectory("C:/avrdude"); 
     prc->start("cmd.exe /C start avrdude.exe -c breakout -P ft0 -p m2560 -U flash:w:\"" + m_file + "\":a"); 
    } 
} 
+0

Merci beaucoup pour la réponse! C'est ma première application en QT et j'ai essayé d'intégrer QML et C++. Vous m'avez montré la façon la plus simple;) – sochinho

+0

De rien, mais il n'y a pas de QML à ce post –