1 IO 进程 线程
IO------->Qt第五天笔记
QFile file("1.txt");file.open();file.read();file.write
QFileInfo info(文件名);info.getname
1 进程
QProcess::execute--->启动新进程(windows自带、QT)
#include "widget.h"
#include "ui_widget.h"
#include <QProcess>//进程类
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
#if 0
//QProcess::execute("Notepad");//在windows环境下启动记事本程序
//QProcess::execute("MSPAINT");//在windows环境下启动画图程序
QProcess::execute("day5-drawlinemore");
#endif
//若加上static,QProcess对象加载进程,当对象销毁后,被加载的进程被杀死
static QProcess process;//定义一个进程对象
process.setProgram("day5-drawlinemore");//设置要启动的程序
process.start();//启动程序
}
2 线程----->QThread 线程基类
QT为什么需要线程?
当界面的某个成员函数中有比较耗时的操作时,界面就会出现卡死现象
如何解决呢?创建一个新线程,让其处理耗时的操作,当前进程返回正常值
如何创建线程?用线程类创建一个线程对象,对象就是一个线程
在QT工程中要使用线程,需要以下要素:
1 需要一个线程子类对象 QThread-->mythread-->对象
2 需要在线程子类中重写线程执行函数run();
3 需要启动线程 对象.start();
qt中使用线程总结:
1 新建一个线程类继承自QThread
2 重写线程执行函数run()
3 在主界面中启动线程(start),则run()就会被自动调用,用户无需主动调用run()
4 当子线程要退出时,给主进程发信号,主进程在对应的槽函数中回收资源
mythread.h文件:
#ifndef MYTHREAD
#define MYTHREAD
#include <QThread>//线程基类
class myThread:public QThread
{
Q_OBJECT
public:
explicit myThread(QObject *parent=0);
signals:
void doDone();//声明一个信号函数,用于给进程发信号
protected:
void run();//声明线程执行函数
};
#endif // MYTHREAD
mythread.cpp文件:
#include "mythread.h"
#include <QDebug>
myThread::myThread(QObject *parent):QThread(parent)
{
qDebug()<<"myThread()---------------\r\n";
}
void myThread::run()
{
int i=0;
for(;i<10;i++)
{
QThread::sleep(1);//睡眠一秒
qDebug()<<"hello world-------\r\n";
}
emit doDone();//给进程发信号
}
widget.h文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "mythread.h"
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_clicked();
void threadDoneSlot();//doDone信号对应的槽函数
private:
Ui::Widget *ui;
myThread *thread;//线程
};
#endif // WIDGET_H
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
thread=new myThread(this);//初始化线程对象指针
connect(thread,SIGNAL(doDone()),this,SLOT(threadDoneSlot()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
thread->start();//启动线程
}
void Widget::threadDoneSlot()
{
qDebug()<<"thread->exit--------------\r\n";
thread->quit();//退出线程
thread->wait();//回收线程退出状态值
}
3 网络编程
QTcpSocket
QTcpServer
客户端QT文件:
widget.h文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtNetwork>//网络操作类
#include <QTcpSocket>//TCPsocket类
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QTcpSocket *_socket;
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void recv_info();//接受数据
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(" 客户端");
_socket=new QTcpSocket;//初始化socket
_socket->connectToHost("127.0.0.1",9988);//发送连接请求
//信号和槽的关联
//readyRead()---->有可读数据,发送信号
connect(_socket,SIGNAL(readyRead()),this,SLOT(recv_info()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()//发送
{
//1.取出文本编辑框内容,显示到本地文本输出框
QString str1=ui->textEdit->toPlainText();
ui->textBrowser->append("client:");//append()---->内容追加
ui->textBrowser->append(str1);
//2.将数据发送给对方
QByteArray buff=str1.toUtf8();//toUtf8()---->编码通用转换,QByteArray-->字节数组类
_socket->write(buff);
//3.清空文本输入框
ui->textEdit->clear();
}
void Widget::on_pushButton_2_clicked()//退出
{
this->close();
}
void Widget::recv_info()//接受数据
{
QString str=_socket->readAll();//通过socket读取数据
ui->textBrowser->append("server:");
ui->textBrowser->append(str);
}
服务器QT文件:
widget.h文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>//TCP服务器类
#include <QTcpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QTcpServer *_server;
QTcpSocket *_socket;
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void recv_info();//接收数据
void slotConnect();//处理客户端连接请求
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件:
#include "widget.h"
#include "ui_widget.h"
#include <QByteArray>//字节数组类
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(" 服务器");
_server=new QTcpServer;//初始化服务器对象指针
_server->listen(QHostAddress::Any,9988);//建立监听
//信号和槽的关联
//newConnection()---->监听是否有连接信号
connect(_server,SIGNAL(newConnection()),this,SLOT(slotConnect()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()//发送
{
//1.取出文本编辑框内容,显示到本地文本输出框
QString str=ui->textEdit->toPlainText();
ui->textBrowser->append("server:");//append()---->内容追加
ui->textBrowser->append(str);
//2.将数据发送给对方
QByteArray buff=str.toUtf8();//toUtf8()---->编码通用转换,QByteArray-->字节数组类
_socket->write(buff);
//3.清空文本输入框
ui->textEdit->clear();
}
void Widget::on_pushButton_2_clicked()//退出
{
this->close();
}
void Widget::recv_info()
{
QString str1=_socket->readAll();//通过socket读取数据
ui->textBrowser->append("client:");
ui->textBrowser->append(str1);
}
void Widget::slotConnect()//建立连接
{
//如果有等待的连接请求,返回true
while(_server->hasPendingConnections())
{
//将等待的连接给_socket
_socket=_server->nextPendingConnection();
connect(_socket,SIGNAL(readyRead()),this,SLOT(recv_info()));//readyRead()---->有可读数据,发送信号
}
}
4 数据库--->sqlite3.c
QSqlDatabase--->数据库类
QSqlQuery---->查询类
#include "widget.h"
#include <QApplication>
#include <QSqlDatabase>//数据库类
#include <QSqlQuery>//查询类
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//Widget w;
//w.show();
//1.创建数据库对象
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");//添加数据库驱动(数据库种类)
if(!db.isValid())//数据库是否创建成功
{
qDebug()<<"create database error!\r\n";
return -1;
}
qDebug()<<"create database ok!\r\n";
//2.给数据库起名
db.setDatabaseName("test0804.db");
//3.打开数据库
if(!db.open())//数据库是否打开成功
{
qDebug()<<"open database error!\r\n";
return -1;
}
qDebug()<<"open database ok!\r\n";
//4.给数据库创建表
QSqlQuery que;
if(!que.exec("create table if not exists student"
"(id int,name text,age int)"))
{
qDebug()<<"create table error!\r\n";
goto EER_STEP;
}
qDebug()<<"create table ok!\r\n";
//5.给该表插入数据
for(int i=0;i<5;i++)
{
std::string stu[5]={"zhangsan","lisi","niuliu","wangwu","yansan"};
QString str;
str.sprintf("insert into student values(%d,'%s',%d)",
i+1,stu[i].data(),i+20);
if(!que.exec(str))
{
qDebug()<<"insert error!\r\n";
goto EER_STEP;
}
qDebug()<<"insert ok!\r\n";
}
//6.查询数据库表内容
if(!que.exec("select *from student"))
{
qDebug()<<"select error!\r\n";
goto EER_STEP;
}
qDebug()<<"select ok!\r\n";
while(que.next())//获取数据库表中的一行数据
{
QString id=que.value(0).toString();//将第一列
QString name=que.value(1).toString();
QString age=que.value(2).toString();
qDebug()<<"id="<<id<<endl;
qDebug()<<"name="<<name<<endl;
qDebug()<<"age="<<age<<endl;
}
db.close();
return 0;
EER_STEP:
{
qDebug()<<"sql exec error!\r\n";
db.close();
return -1;
}
return a.exec();
}