QSignalMapper не обновляет параметр после выбора файла

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

Часть кода 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

Решение

Вы можете создать 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)"));
}

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

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");
}
}
1

Другие решения


По вопросам рекламы [email protected]