2015-07-27 3 views
0

Я делаю приложение, которое сможет запрограммировать мою доску. Я хотел бы выбрать файл через диалог файла и загрузить доску с выбранным файлом кнопкой загрузки. У меня есть два класса: MyFileDialog и CommandProcess. Я подключил сигнал с нажатой кнопкой загрузки к сигнальному картографу, и я сопоставил его с слотом CommandProcess :: startProcess, который выполняет процесс с путём выбранного файла, но путь неправильный, если я не укажу его при запуске программы. Как обновить параметр сопоставления после выбора файла?QSignalMapper не обновляет параметр после выбора файла

Часть 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 &))); 

класс MyFileDialog:

public: 
    MyFileDialog(); 
    QString getFilename(); 

private: 
    QFileDialog fd; 

public slots: 
    void openMyFileDialog(); 

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

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

Вы уверены, что вам нужно это 'QSignalMapper'? Вы можете открыть fileDialog, chech, если файл существует, и вызвать 'Proc :: startProcess()' с аргументом пути к файлу –

+1

Или другим способом - сохранить путь к закрытому файлу в членском классе 'MyFileDialog' –

+0

Может быть полезно, должен ли я хранить путь после нажатия кнопки нажмите кнопку? – sochinho

ответ

1

Вы можете создать 2 слота на свой член MainWindow класса и QString для сохранения пути к файлу следующим образом:

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; 

}; 

Создание соединений в классе конструктора и инициализировать переменную m_file:

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())); 
} 

Тогда время, чтобы реализовать описанные слоты. Давайте QFileDialog::getOpenFileName статический результат метода:

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

А если файл уже выбран в слот загрузки мы можем Tranfer их или делать все, что вы хотите:

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

Спасибо большое за ответ! Это мое первое приложение в QT, и я попытался интегрировать QML и C++. Вы показали мне более простой способ;) – sochinho

+0

Добро пожаловать, но на этом посту нет QML –

Смежные вопросы