我使用 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);
}
你对
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.