【问题标题】:QFileDialog How to set filename to the text field and use QFileDialog separately with few textfieldsQFileDialog 如何将文件名设置为文本字段并使用少量文本字段单独使用 QFileDialog
【发布时间】:2016-09-07 17:10:19
【问题描述】:

我正在尝试为必须对给定文件执行某些操作的程序编写 GUI。它的逻辑是:

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

【问题讨论】:

  • 您可以使用fldFilePath-&gt;text()获取您的文本字段的值。

标签: c++ qt qt5


【解决方案1】:

您应该为此使用QSignalMapper

您的代码可能如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2020-06-03
    • 2017-09-04
    • 2015-03-25
    • 2021-12-26
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多