Qt 打开QDialog并同时运行QProcess

Qt 打开QDialog并同时运行QProcess,qt,signals-slots,qprocess,qdialog,Qt,Signals Slots,Qprocess,Qdialog,这是我的btconnect.h文件 #ifndef BTCONNECT_H #define BTCONNECT_H #include "scandialog.h" namespace Ui { class BTConnect; } class BTConnect : public QWidget { Q_OBJECT public: explicit BTConnect(QWidget *parent = 0); ~BTConnect(); private sl

这是我的btconnect.h文件

#ifndef BTCONNECT_H
#define BTCONNECT_H

#include "scandialog.h"

namespace Ui {
class BTConnect;
}

class BTConnect : public QWidget
{
    Q_OBJECT

public:
    explicit BTConnect(QWidget *parent = 0);
    ~BTConnect();

private slots:
    void on_ScanButton_clicked();

    void ScanBTDevices();

    //some slots here

    void ScanDialogShow();

    void ScanDialogClose();

public slots:
//some slots here

private:
    Ui::BTConnect *ui;

    QProcess BTscan_Process;

    scanDialog *scan;
};

#endif // BTCONNECT_H
btconnect.cpp

BTConnect::BTConnect(QWidget *parent) :
QWidget(parent),
ui(new Ui::BTConnect)
{
    //set the userinterface as BTConnect.ui
    ui->setupUi(this);

    scan = new scanDialog(this);
}


void BTConnect::ScanDialogShow()
{
    scan->show();
}

void BTConnect::ScanDialogClose()
{
    scan->close();
}

void BTConnect::ScanBTDevices()
{
    ScanDialogShow();

    //Command to scan nearby bluetooth devices
    //"hcitool scan"
    QString cmd("hcitool scan");

    //start the process
    BTscan_Process.start(cmd);

    //Wait for the processs to finish with a timeout of 20 seconds
    if(BTscan_Process.waitForFinished(20000))
    {
        //Clear the list widget
        this->ui->listWidget->clear();

        //Read the command line output and store it in QString out
        QString out(BTscan_Process.readAllStandardOutput());

        //Split the QString every new line and save theve in a QStringList
        QStringList OutSplit = out.split("\n");

        //Parse the QStringList in btCellsParser
        btCellsParser cp(OutSplit);

        for(unsigned int i = 0; i<cp.count(); i++)
        {
           //writing in listwidget
        }

    }

    ScanDialogClose();
}

void BTConnect::on_ScanButton_clicked()
{
    //Scan for available nearby bluetooth devices
    ScanBTDevices();
}
BTConnect::BTConnect(QWidget*parent):
QWidget(母公司),
ui(新ui::BTConnect)
{
//将用户界面设置为BTConnect.ui
用户界面->设置用户界面(此);
扫描=新的扫描日志(此);
}
void BTConnect::ScanDialogShow()
{
扫描->显示();
}
void BTConnect::ScanDialogClose()
{
扫描->关闭();
}
void BTConnect::ScanBTDevices()
{
ScanDialogShow();
//命令扫描附近的蓝牙设备
//“hcitool扫描”
QString cmd(“hcitool扫描”);
//开始这个过程
BTscan_进程启动(cmd);
//等待进程以20秒的超时时间结束
if(BTscan_进程等待完成(20000))
{
//清除列表小部件
此->用户界面->列表小部件->清除();
//读取命令行输出并将其存储在QString out中
QString out(BTscan_Process.readAllStandardOutput());
//将QString拆分为每一行,并将它们保存在QStringList中
QStringList OutSplit=out.split(“\n”);
//解析btCellsParser中的QStringList
btCellsParser-cp(OutSplit);

对于(unsigned int i=0;i您在执行
show
(因为
waitForFinished
)时不会返回事件循环,并且在执行
exec
时不会继续处理代码

您应该连接到
finished
信号,并在那里处理它,然后使用单次触发计时器取消它,而不是
waitForFinished

void BTConnect::on_BTscanFinished()//new slot
{
   //Clear the list widget
    this->ui->listWidget->clear();

    //Read the command line output and store it in QString out
    QString out(BTscan_Process.readAllStandardOutput());

    //Split the QString every new line and save theve in a QStringList
    QStringList OutSplit = out.split("\n");

    //Parse the QStringList in btCellsParser
    btCellsParser cp(OutSplit);

    for(unsigned int i = 0; i<cp.count(); i++)
    {
       //writing in listwidget
    }
    ScanDialogClose();
}

void BTConnect::ScanBTDevices()
{
    ScanDialogShow();

    //Command to scan nearby bluetooth devices
    //"hcitool scan"
    QString cmd("hcitool scan");

    //start the process
    connect(BTscan_Process, SIGNAL(finished()), this, SLOT(on_BTscanFinished()));
    BTscan_Process.start(cmd);
    QTimer::singleShot(20000, scan, SLOT(close()));
}
void BTConnect::on_BTscanFinished()//新插槽
{
//清除列表小部件
此->用户界面->列表小部件->清除();
//读取命令行输出并将其存储在QString out中
QString out(BTscan_Process.readAllStandardOutput());
//将QString拆分为每一行,并将它们保存在QStringList中
QStringList OutSplit=out.split(“\n”);
//解析btCellsParser中的QStringList
btCellsParser-cp(OutSplit);

对于(unsigned int i=0;i而言,问题在于
QDialog::exec
QProcess::waitForFinished
函数会阻止事件循环。永远不会阻止事件循环。因此,您只需要更异步地执行操作

QProcess
类可以使用诸如
readreadreadStandardOutput
之类的信号进行异步处理。而
QDialog
可以使用
open
插槽异步显示

例如:

void ScanBTDevices() {
    // Open dialog when process is started
    connect(process, SIGNAL(started()), dialog, SLOT(open()));

    // Read standard output asynchronously
    connect(process, SIGNAL(readyReadStandardOutput()), SLOT(onReadyRead()));

    // Start process asynchronously (for example I use recursive ls)
    process->start("ls -R /");
}

void onReadyRead() {
    // Write to list widget
    dialog->appendText(QString(process->readAllStandardOutput()));
}
在按进程生成期间,数据将附加到对话框中。
还可以使用
QProcess::finished
信号关闭对话框。

非常感谢!!你太棒了!:)谢谢你的回答:)