How to add my open files with my Qt app in Pythons subprocess.Popen()

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

我使用 Qt 制作了一个简单的记事本编辑器,我尝试用它打开:

p = subprocess.Popen(["myNotepadApp.exe", "myFile.py"])

这会打开我的应用程序,但不会打开指定的文件 myFile.py。我需要为我的 Qt 打开功能对我的 Qt 代码进行任何更改吗?使用此 subprocess.Popen() 函数打开文件是否会调用我的 Qt 打开函数?

void objectDetector::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Open file");
    QFile file(fileName);
    currentFile = fileName;
    if(!file.open(QIODevice::ReadOnly| QFile::Text)){
        QMessageBox::warning(this, "Warning", "Cannot open file : " + file.errorString());
        return;
    }
    setWindowTitle("Object Editor");
    QTextStream in(&file);
    QString text = in.readAll();
    ui->textEdit->setText(text);
    file.close();

}

这里是 UI 对象的构造函数,如果它是相关的

objectDetector::objectDetector(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::objectDetector)
{
    setWindowTitle("Object Editor");
    ui->setupUi(this);
    this->setCentralWidget(ui->textEdit);
}
python c++ qt subprocess popen
1个回答
0
投票

你对

Popen
的调用与你在 shell 中键入以下内容大致相同:

myNotepadApp.exe myFile.py

因此,“myFile.py”作为 argument 传递给您的可执行文件,但它无法对其执行任何操作。您的 Qt 应用程序缺少该功能,整个问题与 Python 的

Popen
.

无关

在 C++ 中(就像在 C 中一样),您可以使用

main()
或参数计数和
argc
(参数本身的向量)在
argv
中访问这些参数。 Qt 还处理一些 Qt 特定标志 的参数,并提供
QCoreApplication::arguments()
作为访问它们的便捷方式。

因为你没有分享你的

main.cpp
,我得猜猜它长什么样。为了使其工作,您需要执行以下操作:

int main(int argc, char** argv)
{
    // Pass argc and argv to QApplication
    QApplication app(argc, argv);
    // Create your classes
    auto* od = new objectDetector(&app);
    // Get arguments back from QApplication
    // Qt will have stripped argv of all Qt-specific flags so whatever is left in here is for us.
    const auto args = app.arguments();
    if (args.size() > 1)
    {
        // args[0] is the name of your executable, we don't want that
        const auto fileName = args[1];
        // Pass the first arg to objectDetector as file name to open it
        od->openFile(fileName);
    }
    return app.exec();
}

而且你必须给你的班级

objectDetector
一个处理文件名的方法。幸运的是,您已经编写了我们需要的所有代码:

void objectDetector::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Open file");
    openFile(fileName);
}

// This needs to be public
void objectDetector::openFile(const QString& fileName)
{
    // Looks familiar? It's your own code extracted as a method
    QFile file(fileName);
    currentFile = fileName;
    if(!file.open(QIODevice::ReadOnly| QFile::Text)){
        QMessageBox::warning(this, "Warning", "Cannot open file : " + file.errorString());
        return;
    }
    setWindowTitle("Object Editor");
    QTextStream in(&file);
    QString text = in.readAll();
    ui->textEdit->setText(text);
    file.close();
}

这样,第一个参数将被视为文件名,您的应用程序将尝试打开它。

然而,还有改进的余地。它不会处理多个文件名,传递未命名文件的字符串将导致出现“无法打开文件”消息框。对于比获取第一个参数更复杂的事情,请考虑设置 QCommandLineParser.

© www.soinside.com 2019 - 2024. All rights reserved.