Qt 打开QDialog并同时运行QProcess
这是我的btconnect.h文件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
#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
信号关闭对话框。非常感谢!!你太棒了!:)谢谢你的回答:)