我正在用 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();
}
如果您只想选择行编辑,这很简单:
QObject::connect(theFileDialog, &QFileDialog::fileSelected,
theLineEdit, &QLineEdit::setText);
如果您需要中间更复杂的逻辑,我建议使用 lambda。
问题中报告的代码存在一些问题:
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();
}