【问题标题】:Launching a shell script when Button Pressed on GUI made with Qt在使用 Qt 制作的 GUI 上按下按钮时启动 shell 脚本
【发布时间】:2014-07-09 02:11:30
【问题描述】:

我有一个 shell 脚本,当在触摸屏 PC (Uubntu Lucid Lynx) 上执行时,它会在远程服务器上进行备份。现在,我希望通过在其上运行的 GUI 应用程序中创建一个小按钮来实现自动化。该应用程序是使用 Qt 和 C++ 构建的。

到目前为止,我可以使用QFileDialog 打开文件夹浏览器并导航到 .sh 文件,但是否可以直接打开已定义的 .sh 文件(即通过定义名称和位置)?

有一些提示应该使用 QProcess,但我对它的实现有点困惑。提前致谢。

【问题讨论】:

    标签: c++ linux qt shell qprocess


    【解决方案1】:

    您可以将其设为阻塞或非阻塞。这取决于您是想阻止主进程还是以异步模式在后台运行 shell 脚本。

    另外,由于不需要输出,这里甚至不需要实例化,使用静态方法即可。

    Blocking code

    #include <QString>
    #include <QFileDialog>
    #include <QProcess>
    #include <QDebug>
    
    ...
    
    // Get this file name dynamically with an input GUI element, like QFileDialog
    // or hard code the string here.
    
    QString fileName = QFileDialog::getOpenFileName(this,
    tr("Open Script"), "/", tr("Script Files (*.sh)"));
    
    if (QProcess::execute(QString("/bin/sh") + fileName) < 0)
        qDebug() << "Failed to run";
    

    Non-blocking

    #include <QString>
    #include <QFileDialog>
    #include <QProcess>
    #include <QDebug>
    
    ...
    
    // Get this file name dynamically with an input GUI element, like QFileDialog
    // or hard code the string here.
    
    QString fileName = QFileDialog::getOpenFileName(this,
    tr("Open Script"), "/", tr("Script Files (*.sh)"));
    
    // Uniform initialization requires C++11 support, so you would need to put
    // this into your project file: CONFIG+=c+11
    
    if (!QProcess::startDetached("/bin/sh", QStringList{fileName}))
        qDebug() << "Failed to run";
    

    【讨论】:

    • 虽然我解决了我的问题,但是你能告诉我阻塞和非阻塞的基本区别是什么吗???实际上我是这个领域的新手......
    • 不不,实际上我的问题是通过按钮正确执行我的 shell 脚本&我无法为 QProcess 找到正确的编码格式,也许因为 qt 文档很有帮助,但也有点很深入,所以我有点困惑。我想知道阻塞和非阻塞之间的区别(概念)......
    • 我用正确的 QProcess 格式解决了这个问题,我不知道它的代码结构。我以前使用 QFileDialog 打开文件夹浏览器并手动选择和运行程序,但这很乏味。所以现在,我使用代码 sn-p 在单击按钮时执行脚本。 void MainWindow::on_pushButton_clicked() { QProcess 进程; process.startDetached("/bin/sh", QStringList()
    • @AmarjitBiswas:我个人不会建议该代码,因为我认为它忽略了一些编程实践,但这是您的选择。
    • 然后???我跟着它因为,你知道它使收支相抵......那应该是正确的吗???现在浏览您的文档,到目前为止我理解的一件事,对于我的应用程序,我应该开始分离。
    【解决方案2】:

    您可以运行 shell 或 bash,将您的脚本作为参数传递:

    QProcess process;
    process.startDetached("/bin/sh", QStringList()<< "/Path/to/myScript.sh");
    

    【讨论】:

      【解决方案3】:

      使用QProcess::startDetached 重载之一:http://qt-project.org/doc/qt-4.8/qprocess.html#startDetached。这个最全:

      bool QProcess::startDetached ( const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid = 0 ) [static]
      

      使用示例:

      QProcess::startDetached("/.../script", QStringList { "-i", "a.txt", ... });
      

      QStringList 上面的构造函数使用 C++11 特性。您始终可以以 C++03 支持的方式构造 QStringList,例如QStringlist list; list &lt;&lt; "-i" &lt;&lt; "a.txt"; 或者,如果您不需要向脚本传递任何参数,只需调用 QProcess::startDetached("/.../script")。

      如果您需要接收脚本的输出,您可以创建QProcess 对象并调用start。这里有很好的描述:http://qt-project.org/doc/qt-4.8/qprocess.html#details

      【讨论】:

        猜你喜欢
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多