QT中QProcess调用外部exe文件的问题!

现在有一个外部执行文件Tesseract.exe,该工具在cmd中在目标图片的路径下,输入tesse ract XXXX.jpg res 会在该路径下生成“res.txt”文档,文档里是对该图片OCR识别的结果。
我现在想在QT中调用这个tesseract对图像进行OCR识别,并且获取返回数据打印出来,到底该怎么写?

3个回答

QFile file("res.txt");

if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

return;

QTextStream in(&file);

while (!in.atEnd()) {

QString line = in.readLine();

qDebug()<<line;

}

QProcess::execute("tesse ract XXXX.jpg"); // int execute(const QString &command)

利用void finished ( int exitCode, QProcess::ExitStatus exitStatus )这个信号,在readAll()。或者readAllStandardOutput

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
qt使用QProcess调用外部程序不成功

想要完成一个点击按钮打开外部exe的功能,做了一个button然后转到信号与槽函数这这样的![图片说明](https://img-ask.csdn.net/upload/201605/17/1463485287_208092.png) 两个QProcess调用方法都尝试过了,都是出现一个cmd框一闪就没了,这个程序是vs2012自己编写的一个程序,请问是哪错了 调用的函数![图片说明](https://img-ask.csdn.net/upload/201605/17/1463485370_406599.png)

Linux系统下Qt Creator中使用QProcess调用外部程序没有输出。

如题。 可执行的独立程序如下,是用C语言实现的哲学家就餐问题 ``` #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<unistd.h> #include<semaphore.h> #define N 3 #define LEFT i #define RIGHT (i+1)%N sem_t mutex[N]; int id[N]={0,1,2}; pthread_t thread[N]; void* solve(void*param){ int i=*((int*)param); while(i>=0){ if(i%2==0){ sem_wait(&mutex[LEFT]); sem_wait(&mutex[RIGHT]); printf("phlio %d is eating\n",i); sleep(1); sem_post(&mutex[RIGHT]); sem_post(&mutex[LEFT]); printf("phlio %d is over\n",i); sleep(1); }else{ sem_wait(&mutex[RIGHT]); sem_wait(&mutex[LEFT]); printf("phlio %d is eating\n",i); sleep(1); sem_post(&mutex[LEFT]); sem_post(&mutex[RIGHT]); printf("phlio %d is over\n",i); sleep(1); } } } int main(){ int i=0; for(i=0; i<N; i++){ sem_init(&mutex[i],0,1); pthread_create(&thread[i],NULL,solve,&id[i]); } for(i=0; i<N; i++){ pthread_join(thread[i],NULL); } return 0; } ``` Qt中使用按钮启动外部C程序,已经尝试过的方法如下(4种方法): ``` //第一种方法: void Dialog::on_pushButton_clicked() { QStringList strList; strList <<"null"<<"null"; QProcess::startDetached("/home/alison/ph1/a.out",strList,"/home/alison/ph1"); } //第二种方法: void MainWindow::on_pushButton_clicked() { QProcess *process=new QProcess; QStringList args; args<<"./a.out"; process->start("/home/alison/ph2/a.out",args); } //第三种方法: void MainWindow::on_pushButton_clicked() { QProcess *process=new QProcess; QStringList str; str <<""; process->start("/home/alison/ph2/a.out"); } //第四种方法: void MainWindow::on_pushButton_clicked() { QProcess *process=new QProcess; QProcess::execute("/home/alison/ph2/a.out"); } ``` Qt程序编译没有错误,但运行之后点击按钮没有相应的C程序运行的结果 希望各位大佬可以帮我解答一下哪里需要修改,十分感谢!

QT QProcess 执行外部程序的问题

QProcess process; QProcessEnvironment sysenv= QProcessEnvironmnet::systemEnviroment(); sysenv.insert("PATH",sysenv.value("PATH")+":/home/user") process.setProcessEnviroment(sysenv); process.start("helloworld"); helloworld 在目录/home/user下 执行后找不到命令呢?

Qt关闭QProcess打开的进程问题

槽函数如下,用QProcess打开Windows计算器,但是问什么关不了这个进程?求大神指导 void MainWindow::on_buttonBox_clicked(QAbstractButton *button) { if(ui->buttonBox->button(QDialogButtonBox::Ok) == button) { QString str = "C:/WINDOWS/System32/calc.exe"; process = new QProcess(this); QString string; //process->setProcessChannelMode(QProcess::MergedChannels); qDebug()<<process->isOpen(); process->start(str.trimmed());//trimmed()函数去除字符串最后空格 str1 = process->processId(); ui->lineEdit->setText(QString::number(str1)); qDebug()<<str1; bool bo = process->isOpen(); qDebug()<<bo;//此时程序识别为打开状态 string = process->Text; qDebug()<<string; p = process->pid(); } else if(ui->buttonBox->button(QDialogButtonBox::Cancel) == button) { qDebug()<<str1; qDebug()<<process->isOpen(); if(process->isOpen()) { HANDLE hApp = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, FALSE, str1); if (hApp == NULL) return; TerminateProcess(hApp, NULL); CloseHandle(hApp); } } }

qt调用外部程序的问题

我用的是qt4.8.7版本,项目里有一个QPushButton按钮,我本来的意思是点击按钮发送信号,能够打开CLV播放器程序,但是遇到一个问题:每次点击按钮的时候就会打开两个播放器窗口。如何才能实现只大开一个窗口呢? 注:项目中也有其他按钮(不过不是调用外部程序用),点击都没有这种问题 cpp部分代码: CTrPa::CTrPa(QWidget *parent) : QWidget(parent), ui(new Ui::CTrPa) { ui->setupUi(this); connect(ui->cmbtnoff, SIGNAL(clicked()), this, SLOT(on_cmbtnoff_clicked())); } void CTrPa::on_cmbtnoff_clicked() { Qprocess::startDetached("/usr/bin/cvlc"); ui->cmbtnoff->setVisible(false); } 求助大神帮忙看看,谢谢!!

Vs+Qt环境 QProcess 利用cmd启动第三方的exe,无法正常启动

1.操作如题,在主线程中调用QPRocess启动cmd,调试的时候cmd可以在进程中查看到,利用QProcess的write向Cmd输入命令,命令为启动第三方exe,运行之后第三方的exe没有在进程中查看到,说明启动失败。按照我的理解应该启动cmd之后,执行命令,调试的控制台窗口应该会变成第三方的控制台的状态。而且应该在代进程管理器中可以查看到第三方exe的。代码如下: QString argument = QString("-od G:/test -aet DCMTKTEST 666 -fe .dcm");// .arg(savestrpath); QString fullpath = QString("%1/%2").arg(QString("G:/Utilities/Debug/DCMTK/bin")).arg(QString("storescp.exe ")); QString argv(fullpath + argument); QString program; program.append("cmd.exe"); prog = new QProcess(this); prog->start(program); char* ch; QByteArray ba = argv.toLatin1(); // must ch = ba.data(); prog->write(ch); prog->write("\n\r");

QT中调用外部程序,输出显示的问题

Linux下QT调用外部程序F,F运行的时间比较长,在运行过程中不断有输出,用scrollarea+label(或者什么textedit)来显示程序F的输出,用的是readAll(),程序运行过程中的输出可以看到,但是当F程序运行完毕的时候,只有最后一小部分的输出能够在区域里看到.滚动条都没有或者滚动条的区域很小,前面一部分的输出根本看不到了。。 求教。。 部分代码: out=new QTextEdit(); ui->scrollArea->setWidget(out); out->setReadOnly(true); ui->scrollArea->setWidgetResizable(true); 部分代码: QProcess *proc=new QProcess(this); connect(proc,SIGNAL(readyRead()),this,SLOT(on_read())); proc->start("F",param); 部分代码: void MainWindow:: on_read() { QProcess *proc=(QProcess *)sender(); QString result=proc->readAll(); out->setText(result); }

QProcess 启用CMD.exe,实现交互多次执行读写指令(在Win7平台)

因项目要在Windows下开启CMD程序,通过与CMD程序交互进行读写, 举例:开启CMD程序 按顺序执行如下指令,每执行一条指令后,并读取CMD的反馈信息,再执行下一条指令,再读取CMD反馈信息,当指令全部都执行完毕后,再关闭CMD程序; 0.cd f:\test(进入f:\test\目录); 1.dir(查看当前目录文件); 2.ver (查看系统版本); 3.ipconfig(查看IP地址); 4.time (查看当前时间); 5.ping 192.168.1.1 -n 10 (Ping路由器地址); 6.iperf -s (执行iperf指令); 备注:把读CMD输出信息动作放至到while中让它循环读取CMD的输出信息,写一条读一条,就像串口通信一样; 目前状态是:通过QProcess启动CMD,可以读出CMD启动时输出的信息,但后面再调用进程调用wirte(QString *)给CMD下指令,wirte执行完成后,CMD没有任何反馈? 在论坛上找了好久没有和我用法相同的情况,CSDN博客"一去二三里"也没有,请问那路前辈,大侠,谁这样弄过,我该要如何写? 第一次用QT,麻烦大家了。 如下是我的代码: #include<QApplication.h> #include<QWidget.h> #include<QDialog.h> #include<QTextcodec.h> #include<QString.h> #include "MainWindow.h" int main(int argc, char*argv[]) { QApplication a(argc,argv); QTextCodec *codec = QTextCodec::codecForName("GBK"); QTextCodec::setCodecForTr(codec); QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); MainWindow w; w.show(); return a.exec(); } //------------------------------------------workthread.h file------------------------------------------ #ifndef WORKTHREAD_H #define WORKTHREAD_H #include<QObject.h> #include<QWidget.h> #include<QThread.h> #include<QString.h> #include<Qthread.h> class QProcess; class workthread:public QObject { Q_OBJECT public: explicit workthread( QObject *param=0); ~workthread(); bool b_loopread; public: QProcess* myChildProcess; public slots: void read_slot(); void write_slot(QString ); void stopread_slot(); void IniCmdThread_slot(); // void doWork(int parameter) // { // qDebug()<<"receive the execute signal---------------------------------"; // qDebug()<<" current thread ID:"<<QThread::currentThreadId(); // //寰幆涓€鐧句竾娆� // for(int i = 0;i!=1000000;++i) // { // ++parameter; // } // //鍙戦€佺粨鏉熶俊鍙� // qDebug()<<" finish the work and sent the resultReady signal\n"; // emit resultReady(parameter); // } //绾跨▼瀹屾垚宸ヤ綔鏃跺彂閫佺殑淇″彿 signals: void senddata_sign(QString); private: void Delay_MSec(unsigned int msec); }; #endif // WORKTHREAD_H //------------------------------------------workthread.cpp file------------------------------------------ #include"workthread.h" #include <QCoreApplication> #include <QProcess> #include <QDebug.h> #include <QString> #include <QTime> workthread::workthread(QObject *param): QObject(param) { b_loopread=false; } workthread::~workthread() { myChildProcess->close(); delete myChildProcess; myChildProcess=NULL; qDebug() << "end myChildProcess " << "\r\n"; } void workthread::IniCmdThread_slot() { qDebug() << "IniCmdThread_slot()"; myChildProcess = new QProcess(this); myChildProcess->setProcessChannelMode(QProcess::MergedChannels); QObject::connect(myChildProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(read_slot())); myChildProcess->start("CMD.exe"); if (!myChildProcess->waitForStarted()) qDebug() << "Make failed:" << myChildProcess->errorString(); else { // qDebug() << "Child Process Started.123 " << myChildProcess->readAll(); b_loopread=true; } } void workthread::read_slot() { while(b_loopread) { Delay_MSec(1000); // if(myChildProcess->waitForReadyRead()) // { char output[128]; qint64 rec=myChildProcess->readLine(output,127); if((strlen(output)!=0)&&(rec!=-1)) { QString tmpstr; tmpstr=output; emit senddata_sign((QString)tmpstr); qDebug() << tmpstr; } // } } } void workthread::write_slot(QString strWrite) { char*ch; QByteArray ba = strWrite.toLatin1(); ch=ba.data(); myChildProcess->write("dir\r"); myChildProcess->waitForBytesWritten(2000); // if(myChildProcess->waitForBytesWritten()) // { qDebug() <<"workthread::write_slot "<<strWrite; // } } void workthread::stopread_slot() { b_loopread=false; } void workthread::Delay_MSec(unsigned int msec) { QTime _Timer = QTime::currentTime().addMSecs(msec); while( QTime::currentTime() < _Timer ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } //----------------------MainWindow.h--------------------------------- #ifndef MAINWINDOW_H #define MAINWINDOW_H #include<QApplication.h> #include <QWidget> //#include"ParentProcess.h" #include"workthread.h" namespace Ui{ class MainWindow; } class MainWindow: public QWidget { Q_OBJECT QThread workerThread; public: explicit MainWindow(QWidget *param=0); ~MainWindow(); signals: void IniCmdThread_sign(); void read_sign(); void write_sign(QString); void stopread_sign(); void sendcomd_sign(QString); public slots: void SendCommand(); void getdata_slot(QString); void stopRead(); private: QString str_rece_total; Ui::MainWindow *MUi; // ParentProcess* obj; }; #endif // MAINWINDOW_H //----------------------MainWindow.cpp--------------------------------- #include"MainWindow.h" #include"ui_MainWindow.h" #include <QProcess> #include <QThread> #include <QByteArray> #include <QDebug> #include <QTextCodec> MainWindow::MainWindow(QWidget* param): QWidget(param), MUi(new Ui::MainWindow) { MUi->setupUi(this); workthread *work=new workthread; work->moveToThread(&workerThread); // QTextCodec::setCodecForTr=QTextCodec::codeForName("UTF-8"); //IniCmdThread_sign淇″彿鍙戝皠鍚�,鍚姩绾跨▼鍒濆鍖朇MD杩涚▼; connect(this, SIGNAL(IniCmdThread_sign()), work, SLOT(IniCmdThread_slot())); //璇ョ嚎绋嬬粨鏉熸椂閿€姣� // connect(&workerThread,SIGNAL(&QThread::finished()), work,SLOT(&QObject::deleteLater())); connect(this, SIGNAL(write_sign(QString)), work, SLOT(write_slot(QString))); connect(this, SIGNAL(read_sign()), work, SLOT(read_slot())); connect(MUi->btnStop,SIGNAL(clicked()), this, SLOT(stopRead())); connect(this, SIGNAL(stopread_sign()), work, SLOT(stopread_slot())); connect(work,SIGNAL(senddata_sign(QString)),this,SLOT(getdata_slot(QString))); connect(this,SIGNAL(sendcomd_sign(QString)),work,SLOT(write_slot(QString))); connect(MUi->btnSend,SIGNAL(clicked()),this,SLOT(SendCommand())); //鍚姩绾跨▼ workerThread.start(); //鍙戝皠淇″彿锛岃皟鐢ㄥ瓙绾跨▼涓繘绋嬧€淐MD.exe鈥�; qDebug()<<"current Main thread ID:"<<QThread::currentThreadId()<<'\n'; emit IniCmdThread_sign(); //鍙戝皠淇″彿锛屽紑濮嬪惊鐜墽琛岋紝璇诲彇杩涚▼鈥淐MD.exe鈥濈殑杩斿洖淇℃伅; emit read_sign(); } MainWindow::~MainWindow() { emit sendcomd_sign("exit\r\n"); workerThread.quit(); workerThread.wait(); delete MUi; } void MainWindow::getdata_slot(QString info) { QString str_info="Recevie:"; str_info.append(info); str_info.append("\n"); str_rece_total.prepend(str_info); MUi->txtMain->setText(str_rece_total); } void MainWindow::SendCommand() { QString str_comd=MUi->txtEditComd->toPlainText(); str_comd+='\r'; emit sendcomd_sign(str_comd); } void MainWindow::stopRead() { emit stopread_sign(); } //void MainWindow::RunTest() //{ // qDebug() << "1235477777"; // qDebug()<<"Read"; // QString outData = obj->myChildProcess->readAllStandardOutput(); // qDebug()<<outData; // MUi->txtMain->setText(outData); //} ![图片说明](https://img-ask.csdn.net/upload/201708/17/1502900760_915387.jpg)

pyqt如何判QProcess.start()是否执行成功

我在写一个程序,获取了用户输入的数据库用户名和密码,并用QProcess.start()执行: p = QtCore.QProcess(self) p.setProcessChannelMode(QtCore.QProcess.ForwardedChannels) p.start("mysql",["-uroot","-pyourpassword"]) 那我该怎么通过返回值或其他方法判断密码是否正确?

QT 如何在其他cpp文件中调用Mainwindow中的单文本框

MainWindow w2; QString Starttime = w2.starttime->text(); QString Endtime= w2.endtime->text(); 报错信息如下: src/plot.cpp: In member function 'void Plot::saveToFile()': src/plot.cpp:222: error: invalid use of incomplete type 'struct QLineEdit' src/plot.h:17: error: forward declaration of 'struct QLineEdit' src/plot.cpp:223: error: invalid use of incomplete type 'struct QLineEdit' src/plot.h:17: error: forward declaration of 'struct QLineEdit'

linux QProcess 终端 输出结果列数不足

我在Linux下Qt通过QProcess调用外部程序,输出结果是按照标准终端80×24的结果 预计是linux终端问题,我如何配置终端使得结果按照120×40输出?(列×行) 或我该怎么改QProcess的stdout? 终端类型是LXTerminal,xterm;Qt4, Debain Linux 其QProcess的输出结果和第一幅图一样,我期望得到第二幅图的结果 ![列数不足](https://img-ask.csdn.net/upload/201504/07/1428385666_425100.png) ![列数足够](https://img-ask.csdn.net/upload/201504/07/1428385644_204077.png)

qt在安卓平台下,怎么调用其它的安卓应用程序

我用QProcess proc->start();不知道安卓应用的可执行文件在哪?

qt 运行出来的框图有残缺

# cpp文件 ``` #include "vsbak.h" #include "ui_vsbak.h" #include <QSettings> #include <QFileDialog> #include<QTime> #include<QtDebug> #include <QMessageBox> #define CONFIG_FILE "config.ini" const QString EXCLUDE_FILE = "/home/hu/project2";// 這個文件沒啥用 Vsbak::Vsbak(QWidget *parent) : QWidget(parent) , ui(new Ui::Vsbak) { ui->setupUi(this); QSettings *configIniRead = new QSettings(CONFIG_FILE, QSettings::IniFormat); dir_src = configIniRead->value("/main/bak_src").toString(); dir_dest = configIniRead->value("/main/bak_dest").toString(); // 配置文件里面有目标地址 gpg_key = configIniRead->value("/main/gpg_key").toString(); exclude_from = configIniRead->value("exclude/exclude").toString(); delete configIniRead; // init bash terminal //QProcess可以用于启动外部程序 cmd = new QProcess(this);// 因为与父类直接释放内存 // Sets the working directory to dir. QProcess will start the process in this directory. //The default behavior is to start the process in the working directory of the calling process. cmd->setWorkingDirectory(dir_src); //This signal is emitted when the process has made new data available //through its standard output channel (stdout). It is emitted regardless of the current read channel. connect(cmd, &QProcess::readyReadStandardOutput, this, &Vsbak::on_readyReadStandardOutput); connect(cmd, &QProcess::readyReadStandardError, this, &Vsbak::on_readyReadStandardError); ui->lineEdit->setText(dir_src); ui->lineEdit_2->setText(dir_dest); // 在ui里直接设置这个地址 // init comboBox init_comboBox(); // init radiobutton: choice full ui->radioButton->setChecked(true); ui->checkBox->setChecked(false); ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } /* * 设置最大可见数目为5,是不是不合理? */ void Vsbak::init_comboBox() // 找压缩好的文件 Combobox 下拉菜单 { /* * 1. 用一个对象进入dir-dest目录下 * 2. 过滤掉包含后追的文件 * 3. 获取被过滤的文件理解 */ // find all backup.tar.gz files //The QDir class provides access to directory structures and their contents. 不仅能看到结构,还可以看到目录 QDir *curDir = new QDir(dir_dest); //The QStringList class provides a list of strings. //可以让你提取一个新的列表只包含这些字符串包含一个特定的字符串(或匹配特定正则表达式) QStringList filter; // 过渡成一个目录 filter << "*.tar.gz" << "*.tar.gz.gpg"; curDir->setNameFilters(filter); // 过滤掉特定的目录下的文件 //Returns a list of QFileInfo objects for all the files and directories in the directory //QDir::entryInfoList()会获取该目录下所有目录和文件的QFileInfo对象的列表 QList<QFileInfo> *tarFileInfo = new QList<QFileInfo>(curDir->entryInfoList(filter)); /* * dir_dest 里面存放的其实都是被压缩的文件,所以用上面的后缀直接进行过滤 * 1. 设置最大的可见数目为5 * 2. 看目录里面有多少,然后放入这个comboBox * 3. 获取被过滤的文件 * 4. 按照顺序放入到combobox中 */ ui->comboBox->clear(); ui->comboBox->setMaxVisibleItems(5); // 最大可见数目 5 //The string will be inserted as the first item in the combobox. ui->comboBox->setInsertPolicy(QComboBox::InsertAtTop); for (int i=0; i< tarFileInfo->count(); i++)// count()只是计算里面的数量,tarFileinfo实际上是一个文件列表 ui->comboBox->addItem(tarFileInfo->at(i).fileName()); } Vsbak::~Vsbak() { delete ui; // 有何作用 if(cmd->state() == QProcess::Running){ cmd->terminate(); cmd->waitForFinished(); } } void Vsbak::on_readyReadStandardOutput() { // QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); // ui->label_4->setText(out); } void Vsbak::on_readyReadStandardError() { QMessageBox::information(0, "Error", cmd->readAllStandardError()); } // change dir_src void Vsbak::on_toolButton_clicked() { /* * 1. 或许dir_src的文件目录名称 * 2. 将dir_src的文件目录名写到lineEdit上面 * 3. 更新配置文件里面的信息 * 4. 设置工作目录 * */ QString dirname; dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_src, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_src = dirname; ui->lineEdit->setText(dir_src); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_src", dir_src); delete configIniWrite; cmd->setWorkingDirectory(dir_src); ui->label_4->setText("change source dir sucess!"); } } // change dir_dest void Vsbak::on_toolButton_2_clicked() { QString dirname; // getExistingDirectory 只获取文件夹 dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_dest, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_dest = dirname; ui->lineEdit_2->setText(dir_dest); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_dest", dir_dest); delete configIniWrite; ui->label_4->setText("change dest dir sucess!"); } } int Vsbak::get_min(QDateTime curTime) { QSettings *configIniReadWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); int lastTime = configIniReadWrite->value("/main/last_time").toInt();// 将值转化成整形 configIniReadWrite->setValue("/main/last_time", curTime.toTime_t()); delete configIniReadWrite; int minDiff = (curTime.toTime_t()-lastTime) / 60 + 1; return minDiff; } void Vsbak::on_checkBox_clicked() { if(ui->checkBox->isChecked()){ ui->checkBox_2->setEnabled(true); ui->checkBox_3->setEnabled(true); } else{ ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } } /* * 3 个 String类型 * targz:time + full.tar.gz * cmd_find:find ./ -type f | grep -v \'Permission denied\' > TEPLIST * cmd_tar *目录列表 * * * */ void Vsbak::on_pushButton_clicked(){ // The QDateTime class provides date and time functions. // 调用QDatetime里面的一个函数,赋给另一个QDatetime的类型 QDateTime current_date_time = QDateTime::currentDateTime(); // 初始化三个String类型 QString targz, cmd_find, cmd_tar; //RadioButton presents an option button that can be toggled on (checked) or off (unchecked). //Radio buttons are typically used to select one option from a set of options. //Use isChecked() to see if a particular button is selected. if(ui->radioButton->isChecked()){ // 如果radiobutton 被选择了,那么就进行备份,如果没有就只输出时间 // Linux find命令用来在指定目录下查找文件。 // 将目前目录其其下子目录中所有一般文件列出 # find . -type f // Linux grep 命令用于查找文件里符合条件的字符串。 // -v 或 --revert-match : 显示不包含匹配文本的所有行。 // 反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。 // ./ 表示当前目录的全路径 当前目录的全路径 没有这个 \'Permission denied\'???? //linux的命令,查找文件然后设置权限 // 这个是不管修改不修改,全部列出来 cmd_find = "find ./ -type f | grep -v \'Permission denied\' > TEPLIST";// 这个功能是什么呢 targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".full.tar.gz"; }else{ // 会替换掉前面的百分之1,替换规则是从小到大 //get_min是一个函数,看它具体怎么实现的,应该是循环遍历了current_date_time,找到最小???? int minDiff = get_min(current_date_time); // 获得是最小的查值 // 完成命令,把距离最新一次全部修改的文件单独列出来 cmd_find = QString("find ./ -mmin -%1 -type f | grep -v \'Permission denied\' > TEPLIST").arg(minDiff); targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".inc.tar.gz"; } // exclude from 是一个配置目录 // tar命令 //-v或--verbose 显示指令执行过程 // --totals 备份文件建立后,列出文件大小 //cmd_tar这是压缩tar的linux命令,将exclude里面的文件全部列出来,进行压缩 cmd_tar = QString("tar --verbose --totals --exclude-vcs %1 --files-from=TEPLIST -czf %2/%3").arg(exclude_from).arg(dir_dest).arg(targz);//?5 // 向调试器输出命令的执行结果,方便调试排错 qDebug()<< cmd_find << endl << cmd_tar<< endl; // 下面整个过程就是执行这个命令 QStringList cmd_pipe;// 初始化了一个String目录 cmd_pipe << "-c" << cmd_find; // 说明这个cmd-pipe已经变成了一个linux的cmd命令了 cmd->start("/bin/bash",cmd_pipe); // 开始一个程序 cmd->waitForFinished(); cmd->close(); cmd->start(cmd_tar);// cmd_tar 也变成了一个程序 cmd->waitForFinished(); cmd->close(); cmd->start("rm -f TEPLIST");// 强制删除teplist, teplist 就是临时文件 cmd->waitForFinished(); /*********** Encrypting*************/ // gpg-k 增加公共钥匙 if(ui->checkBox->isChecked()){ QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput());// 这个输出就不是很理解为什么 if(out.isEmpty()) // -o, --output FILE write output to FILE // c 说是使用对称加密,看起来很奇怪 cmd_enc = QString("gpg -c -o %1/%2.gpg %1/%2").arg(dir_dest).arg(targz); else // e 是加密数据 , 针对 用户 id 进行加密 cmd_enc = QString("gpg -e -r %1 -o %2/%3.gpg %2/%3").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); if(false == ui->checkBox_2->isChecked()){ QString cmd_rm = QString("rm %1/%2.gpg").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } if(false == ui->checkBox_3->isChecked()){ QString cmd_rm = QString("rm %1/%2").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } /* * /home/hu/桌面/vsbak/backup/2019-11-13_19.38.57.full.tar.gz * */ // ui->comboBox->addItem(targz); init_comboBox(); } } void Vsbak::on_pushButton_2_clicked(){ QString targz = ui->comboBox->currentText(); if (targz.endsWith(".tar.gz.gpg")){ targz = targz.remove(".gpg"); QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); if(out.isEmpty()) cmd_enc = QString("gpg -d -o %1/%2 %1/%2.gpg").arg(dir_dest).arg(targz); else cmd_enc = QString("gpg -d -r %1 -o %2/%3 %2/%3.gpg").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); } QString cmd_str = QString("tar -xvf %1/%2").arg(dir_dest).arg(targz); qDebug() << cmd_str; cmd->start(cmd_str); cmd->waitForFinished(); } ``` 上面是cpp文件 下面是 # h文件 #ifndef VSBAK_H #define VSBAK_H #include <QWidget> #include<QProcess> QT_BEGIN_NAMESPACE namespace Ui { class Vsbak; } QT_END_NAMESPACE class Vsbak : public QWidget { Q_OBJECT public: Vsbak(QWidget *parent = nullptr); ~Vsbak(); private slots: void on_readyReadStandardOutput(); void on_readyReadStandardError(); void on_toolButton_clicked(); void on_toolButton_2_clicked(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_checkBox_clicked(); private: Ui::Vsbak *ui; QProcess *cmd; QString dir_dest; QString dir_src; QString gpg_key; QString exclude_from; void init_comboBox(); int get_min(QDateTime curTime);// 获得整形 }; #endif // VSBAK_H 我运行之后出来的qt界面,原本是可以下拉选择的,但是都没有反映,这是为啥

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Intellij IDEA 实用插件安利

1. 前言从2020 年 JVM 生态报告解读 可以看出Intellij IDEA 目前已经稳坐 Java IDE 头把交椅。而且统计得出付费用户已经超过了八成(国外统计)。IDEA 的...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

魂迁光刻,梦绕芯片,中芯国际终获ASML大型光刻机

据羊城晚报报道,近日中芯国际从荷兰进口的一台大型光刻机,顺利通过深圳出口加工区场站两道闸口进入厂区,中芯国际发表公告称该光刻机并非此前盛传的EUV光刻机,主要用于企业复工复产后的生产线扩容。 我们知道EUV主要用于7nm及以下制程的芯片制造,光刻机作为集成电路制造中最关键的设备,对芯片制作工艺有着决定性的影响,被誉为“超精密制造技术皇冠上的明珠”,根据之前中芯国际的公报,目...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

差点跪了...

最近微信又搞出了一个大利器,甚至都上了热搜,当然消息最敏捷的自媒体人,纷纷都开通了自己的视频号。01 视频号是什么呢?视频号是微信体系内的短视频,它不同...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

Vue回炉重造之router路由(更新中)

你好,我是Vam的金豆之路,可以叫我豆哥。2019年年度博客之星、技术领域博客专家。主要领域:前端开发。我的微信是 maomin9761,有什么疑问可以加我哦,自己创建了一个微信技术交流群,可以加我邀请你一起交流学习。最后自己也创建了一个微信公众号,里面的文章是我自己精挑细选的文章,主要介绍各种IT新技术。欢迎关注哦,微信搜索:臻美IT,等你来。 欢迎阅读本博文,本博文主要讲述【】,文字通...

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大胆预测下未来5年的Web开发

在2019年的ReactiveConf 上,《Elm in Action》的作者Richard Feldman对未来5年Web开发的发展做了预测,很有意思,分享给大家。如果你有机会从头...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

内容导航: 1、TIOBE排行榜 2、总榜(2020年6月份) 3、本月前三名 3.1、C 3.2、Java 3.3、Python 4、学习路线图 5、参考地址 1、TIOBE排行榜 TIOBE排行榜是根据全世界互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

​能让德国人放弃现金支付​,也没谁了

在新冠疫情中,德国人越来越多地选择在超市,加油站或其他商店付款时使用非接触式付款方式。德国信贷协会Deutschen Kreditwirtschaft (DK) 的一位发言人告诉德国新...

立即提问
相关内容推荐