如何在 C++ 下的 Qt 5 中从 QFileDialog::getOpenFileName 的输出在 QLineEdit 小部件中写入数据

问题描述 投票:0回答:2

我正在用 C++ 使用 Qt 5 创建一个应用程序。我想让用户选择一个文件,然后在

QLineEdit
小部件中写入所选文件的(绝对)路径。 然后其他小部件将读取该路径,以处理所选文件。

我已经设法使用插槽事件连接方法将按钮连接到

QFileDialog::getOpenFileName
,这样按下按钮,就会出现“选择文件”窗口,并且我设法将路径保存在
QString
中变量。

我对下一步该做什么有疑问。我应该使用另一个事件槽连接吗?但会发生什么事件呢?

QFileDialog::getOpenFileName window
的关闭?

我喜欢使用

QLineEdit
小部件作为“全局变量”的想法,因为用户也可以手动粘贴路径,但我愿意接受其他解决方案。

事件槽连接方法是一个好的选择吗?

我以前有过在 Python 中使用 PyQT 的经验(并且我已经在 Python 中实现了该应用程序,带有回调函数),但我对 C++ 相当陌生。特别是,我很难学习在对象之间传递参数的正确方法。

这就是我到目前为止所做的:

myApp.h

#ifndef MYAPP_H
#define MYAPP_H

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
#include <QSize>
#include <QFileDialog>
#include <QString>
#include <QLineEdit>


class MainWindow : public QWidget {

public:
    MainWindow(QWidget *parent = nullptr);
    
private slots:
    
    void SelectInput();
        
};

#endif /* MYAPP_H */

myApp.cpp

#include "myApp.h"

MainWindow::MainWindow(QWidget *parent)   // questa è la definizione del costruttore
    : QWidget(parent) {
        
    setWindowTitle("Frames extraction");
    
    auto *layout = new QGridLayout(this);
    
    auto *inputbox = new QLineEdit(this);
    layout->addWidget(inputbox, 0, 0);
    inputbox->setFixedSize(QSize(800, 25));
    
    auto *inputBtn = new QPushButton("select input");
    layout->addWidget(inputBtn, 0, 2);
    
    
    connect(inputBtn, &QPushButton::clicked, this, &MainWindow::SelectInput);
    
}



void MainWindow::SelectInput()
{
    
    QString inputFile = QFileDialog::getOpenFileName(this, "Select a file...");
    
}

main.cpp

#include "myApp.h"


int main(int argc, char *argv[]) {

    QApplication app(argc, argv);
    
    MainWindow window;
    window.resize(600, 350);
    window.show();

    return app.exec();
}
c++ qt widget global-variables
2个回答
1
投票

如果您只想选择行编辑,这很简单:

QObject::connect(theFileDialog, &QFileDialog::fileSelected,
                 theLineEdit, &QLineEdit::setText);

如果您需要中间更复杂的逻辑,我建议使用 lambda。


0
投票

问题中报告的代码存在一些问题:

  • myApp.cpp 文件中

    MainWindow::SelectInput()
    槽函数的定义应该创建一个 QDialog 实例,而不仅仅是调用它,然后还应该包含一个“connect()”,用于连接该对话框与 QLineEdit 小部件,

  • QLineEdit
    小部件应在标头中声明,而不是在创建器中声明,以便它对于类是全局的,并且可以通过上一点提到的“connect()”实例访问。

所以,这些是这三个文件的修订版本,解决了问题并提供了所需的功能:

myApp.h

#ifndef MYAPP_H
#define MYAPP_H

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
#include <QSize>
#include <QFileDialog>
#include <QString>
#include <QLineEdit>


class MainWindow : public QWidget {

public:
    MainWindow(QWidget *parent = nullptr);
    
    QLineEdit *inputbox;
    
private slots:
    
    void SelectInput();
        
};

#endif /* MYAPP_H */

myApp.cpp

#include "myApp.h"

MainWindow::MainWindow(QWidget *parent)   // questa è la definizione del costruttore
    : QWidget(parent) {
        
    setWindowTitle("Frames extraction");
    
    auto *layout = new QGridLayout(this);
    
    inputbox = new QLineEdit(this);
    layout->addWidget(inputbox, 0, 0);
    inputbox->setFixedSize(QSize(800, 25));
    
    auto *inputBtn = new QPushButton("select input");
    layout->addWidget(inputBtn, 0, 2);
    
    
    connect(inputBtn, &QPushButton::clicked, this, &MainWindow::SelectInput);
    
}



void MainWindow::SelectInput()
{
    auto *theDialog = new QFileDialog(this);
    
    connect(theDialog, &QFileDialog::fileSelected, inputbox,                        
                                                &QLineEdit::setText);
    theDialog->exec();
}

main.cpp

#include "myApp.h"


int main(int argc, char *argv[]) {

    QApplication app(argc, argv);
    
    MainWindow window;
    window.resize(600, 350);
    window.show();

    return app.exec();
}
© www.soinside.com 2019 - 2024. All rights reserved.