Qt-------->第六天,Qt高级编程

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值