2016-08-27 6 views
1

与えられたファイルでいくつかのアクションを実行する必要があるプログラムのGUIを作成しようとしています。そのロジックは次のようになります。QFileDialogテキストフィールドにファイル名を設定し、いくつかのテキストフィールドでQFileDialogを個別に使用する方法

1)プログラムは1つのテキストフィールドで開始し、1つのボタンが作成されます。

2)ボタンをクリックすると、.exeファイルを選択できます。ファイルが選択されている場合、そのパスは最初のマイボタンと論理的にリンクされているテキストフィールドに設定されます。

3)ファイルが前のステップで選択された場合、それにリンクされた新しいテキストフィールドとボタンのペアが作成されます。メインウィンドウのサイズは、新しいペアが追加されたときに動的に変更する必要があります。

ファイルへのパスを現在のテキストフィールドに設定するにはどうすればよいですか? テキストフィールドのデータを編集する必要があります。 QFileDialogとテキストフィールドとボタンのペアを別に使用できるように、インターフェースを整理する方法。

この場合、信号/スロットの使い方を理解できません。

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QWidget> 
#include <QGridLayout> 
#include <QVBoxLayout> 
#include <QLineEdit> 
#include <QPushButton> 

class MainWindow : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    void makeInterface(); 

private slots: 
    void openFile(); 
}; 

#endif 


#include <QString> 
#include <QFileDialog> 
#include <QDebug> 
#include "mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QWidget(parent) 
{ 
    makeInterface(); 
} 

MainWindow::~MainWindow() {} 

void MainWindow::openFile() 
{ 
    QString fileName = QFileDialog::getOpenFileName(
      this, 
      tr("OpenFile"), 
      QDir::currentPath(), 
      tr("Executable Files (*.exe)")); 
    if (!fileName.isNull()) 
    { 
     qDebug() << fileName; 
    } 
} 

void MainWindow::makeInterface() 
{ 
    QGridLayout *mainLayout = new QGridLayout; 

    QLineEdit *fldFilePath = new QLineEdit; 
    QPushButton *btnOpenFile = new QPushButton("*.exe"); 
    connect(btnOpenFile, SIGNAL(clicked()), this, SLOT(openFile())); 

    mainLayout->addWidget(fldFilePath, 0, 0); 
    mainLayout->addWidget(btnOpenFile, 0, 1); 

    QPushButton *btnBuild = new QPushButton("Build"); 

    mainLayout->addWidget(btnBuild, 5, 0); 

    setLayout(mainLayout); 
} 
+0

あなたは 'fldFilePath->テキスト()'を使用して、テキストフィールドの値を取得することができます。 –

答えて

0

あなたはこのためQSignalMapperを使用する必要があります。

あなたのコードの5月には、次のようになります。

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QWidget> 
#include <QGridLayout> 
#include <QVBoxLayout> 
#include <QLineEdit> 
#include <QPushButton> 
#include <QSignalMapper> 

class MainWindow : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    void makeInterface(); 

private slots: 
    void openFile(QWidget* widget); 

private: 
    QSignalMapper _mapper; 
}; 

#endif 


#include <QString> 
#include <QFileDialog> 
#include <QDebug> 
#include "mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QWidget(parent) 
{ 
    connect(&_mapper, SIGNAL(mapped(QWidget*)), this, SLOT(openFile(QWidget*))); 

    makeInterface(); 
} 

MainWindow::~MainWindow() {} 

void MainWindow::openFile(QWidget* widget) 
{ 
    QString fileName = QFileDialog::getOpenFileName(
      this, 
      tr("OpenFile"), 
      QDir::currentPath(), 
      tr("Executable Files (*.exe)")); 
    if (!fileName.isNull()) 
    { 
     static_cast<QLineEdit*>(widget)->setText(fileName); 
    } 
} 

void MainWindow::makeInterface() 
{ 
    QGridLayout *mainLayout = new QGridLayout; 

    QLineEdit *fldFilePath = new QLineEdit; 
    QPushButton *btnOpenFile = new QPushButton("*.exe"); 
    connect(btnOpenFile, SIGNAL(clicked()), &_mapper, SLOT(map())); 
    _mapper.setMapping(btnOpenFile, fldFilePath); 

    mainLayout->addWidget(fldFilePath, 0, 0); 
    mainLayout->addWidget(btnOpenFile, 0, 1); 

    QPushButton *btnBuild = new QPushButton("Build"); 

    mainLayout->addWidget(btnBuild, 5, 0); 

    setLayout(mainLayout); 
} 
関連する問題