QT编程-一、QT简单控件使用
使用linux 总是觉得shell命令难记忆,返回记录也难看,没有滚动条。有要写个shell命令窗口工具的冲动。有QT正好可以写个小工具练手- shell命令返回获取窗口工具。
使用控件:
QTextEdit
QLineEdit
QPushButton
QComboBox
QPushButton 添加事件处理
设计ui文件,选择QPushButton
,右键菜单中选择“转到槽”,再选择clicked()事件。
例如:
void MainWindow::on_pbtn_run_clicked()
{
ui->textEdit->clear();
//runfork(); //ok
runsystem(); //ok2
}
QTextEdit
清除记录clear()函数
ui->textEdit->clear();
添加记录append 函数
ui->textEdit->append(QString::fromLocal8Bit(buf,i));
QComboBox
添加记录addItem
char g_cmddscstr[128][128];
strcpy(g_cmddscstr[0],"释放删除软件的空间");
ui->comboBox->addItem(g_cmddscstr[0]);
呵呵!一上来就用二维数组,例子有点难度,希望看官有较强的编程基本功。
选择记录的处理函数on_comboBox_currentIndexChanged
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
ui->ledt_cmd->setText(QString::fromLocal8Bit(g_cmdstr[index],strlen(g_cmdstr[index])));
ui->ledt_para->setText(QString::fromLocal8Bit(g_parastr[index],strlen(g_parastr[index])));
}
QString类型
QString 转char* QString成员函数toLocal8Bit().data()
char cmdbuf[200],parabuf[200],tmp[512];
QString cmdstr= ui->ledt_cmd->text();
strcpy(cmdbuf ,cmdstr.toLocal8Bit().data() );
使用PIPO 编程
运行shell命令取得命令的返回,我首先想到的使用pipo,使用fork()函数创建子进程,在子进程里面运行shell命令,命令的返回重定向到pipo中,再从pipo中读出写到界面上。
fork()函数
fork()函数,Linux系统调用
头文件:
#include <unistd.h>
函数定义:
int fork( void );
返回值:
子进程中返回0,父进程中返回子进程ID,出错返回-1
函数说明:
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
示例代码:
#include <unistd.h>
#include <stdio.h>
int main(int argc, void ** argv )
{
int pid = fork();
if(pid < 0 ) {
// print("error!");
} else if( pid == 0 ) {
// print("This is the child process!");
} else {
// print("This is the parent process! child process id = %d", pid);
}
return 0;
}
参考Linux环境编程--waitpid与fork与execlp
https://blog.csdn.net/21aspnet/article/details/6740184
pipe 创建管道
头文件: #include<unistd.h>
原型:result = pipe(int array[2]);
参数:array 包含两个int类型的数组
返回值:-1错误,0成功
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- int main(){
- int apipe[2],i,len;
- char buf[BUFSIZ];
- if(pipe(apipe) == -1){ // 创建一个管道:apipe[0]读,apipe[1]写
- // 数据流向:读 <--- 写, 即apipe[1]流向apipe[0]
- perror("pipe"); // 如果创建失败,输出错误原因,退出
- exit(0);
- }
- fgets(buf,BUFSIZ,stdin); // 从输入端读取数据
- len = strlen(buf); // 获取读入的字符串长度
- write(apipe[1],buf,len); // 将数据写入到apipe[1],写-->读
- for(i=0;i<len;i++)
- buf[i]='-'; // 将buf里面的数据全部变为'-'
- read(apipe[0],buf,len); // 从apipe[0]中读取数据,apipe[1]和apipe[0]
- // 是连接在一起的apipe[1] ---> apipe[0]
- // 而前面已经在apipe[1]中写入了数据buf,buf的
- // 数据来自stdin.
- write(1,buf,len); // 1即代表stdout,向stdout写数据,则输出到屏幕
- // 所以整个一圈下来,输入的数据将会输出到屏幕
- return 0;
- }
参考 PIPO管道通信范列(linux)
https://blog.csdn.net/u012704911/article/details/51982654
参考linux i-o重定向与管道编程
https://blog.csdn.net/fulianzhou/article/details/48895327
使用popen()函数
发现一个好函数popen(),可以返回shell 命令的返回。
char* MainWindow::cmd_system(const char* command)
{
char* result = "";
FILE *fpRead;
fpRead = popen(command, "r");
char buf[1024];
memset(buf,'\0',sizeof(buf));
while(fgets(buf,1024-1,fpRead)!=NULL)
{
//buf[strlen(buf)-1]=0; //去掉0x0a
if(buf[strlen(buf)-1]==0x0a) buf[strlen(buf)-1]=0; //去掉0x0a
ui->textEdit->append(buf);
result = buf;
}
if(fpRead!=NULL)
pclose(fpRead);
return result;
}
也是采用pipo原理的,好用。这样不用自己写pipo编程了。
参考Linux的system()和popen()差异
https://blog.csdn.net/liuxingen/article/details/47057539
程序运行图: