QT部分知识总结

1 篇文章 0 订阅

一、qt基础知识总结

1、ctrl+r:快速运行

2、两种模式的区别:

一个是提供菜单栏的,一个不提供菜单栏

3、界面讲解

layouts:布局=水平布局+垂直布局+网格布局+表单布局

spacers:垫子≈水平框,看不见,帮助调整位置的一个东西

buttons:radio button(单选)、check box(多选)

item views:操作数据库的时候会用到

item widgets:单元控件,做文件管理系统会用到,文件展开

containers:容器,可以装一堆控件

input widgets:输入

display widgets:

  • line edit:只能写一行

  • text edit:可以写很多行

3、水平布局、垂直布局实现

首先选中要进行水平布局的控件,然后点击2实现水平布局

  • 设置水平布局变量所占比例

  • 实现全屏

选择text edit,然后选择整个大框,然后点击垂直布局,可以实现:

4、qt预览快捷键

alt+shift+r

5、显示到屏幕

先定义私有成员QString,然后转到槽构建对应函数,并展示到界面

、设置屏幕大小、设置文本框大小,设置文本框字体样式

6、清空

expression.clear();//字符串不是指针,所以直接用.清空就可以了

7.栈在qt中的头文件:

#include<QStack>

8、往前缩进

shift+tab

9、把qstring转换为char *

10、字符串转换

  • QString转换String

string s = qstr.toStdString();

  • String转换QString

QString qstr2 = QString::fromStdString(s);

二、QTimer 定时器类

定时器类QTimer主要有两个功能:

● 周期性执行某个动作

● 延迟一段时间后执行某个动作

QTimer类与之前的QButtonGroup一样,需要手动控制堆内存对象的创建和销毁。

QTimer的常用属性如下所示。

● interval : int

如果是一次性的定时器,此属性表示延迟执行的时间;

如果是周期性的定时器,此属性表示间隔执行的时间。

时间单位毫秒。

● singleShot : bool

此属性表示定时器是否是一次性,如果不是一次性就是周期性。

QTImer的常用函数如下所示。

● void QTimer::start() [slot]

开始或重新开始定时器,如果定时器已经在运行,则会停止运行后再次运行。

● void QTimer::stop() [slot]

停止运行

● void QTimer::timeout() [signal]

定时器出发时发射的信号

三、信号和槽

1、信号

当用户或系统触发一个动作,导致某个窗口发送变化,该空间就会发射一个信号,信号就可以调用一个函数,必要时还可以附加参数。

如:QPushButton 控件中就有 clicked(void) 信号。

2、槽

槽就一个普通的类成员函数,它可以是公有的、私有的、保护的,可以被重载也可以被覆盖,其参数、返回值可以是任意类型,可以被直接调用。

与普通函数的区别就是它可以被信号触发,自动执行。

如:窗口控件QWidget中默认就有 close(void) 槽函数。

3、信号和槽的连接

bool connect ( const QObject * sender, // 信号发送者 const char * signal, // 信号签名字符串const QObject * receiver, // 信号的接收者const char * method); // 槽函数签名字符串SIGNAL() 将信号函数签名转换成字符串SLOT() 将槽函数签名转换成字符串

四、Qt常用控件

QLabel:标签控件,同来显示简单的文本,在界面上只读的setText 设置显示内容text 获取标签上的字符串,返回值是QString

QPushButton:按钮控件同样具有setText、text重要的功能是 单击信号 clicked(),也有双击、悬停、按下、弹起信号。

QRadioButton:单选按键,同窗口下只能有一个被选中重要功能是选中和取消选中信号

QLineEdit:单行输入文本框常用操作时获取它的输入内容

QTextEdit:多行输入文本框常用于输入大段文字,输入的内容可以换行,自带滚动条。

QComboBox:下拉输入框它输入的内容只能通过下拉按键选择,是防止用户输入错误常用解决方法。QTextBrower:多行文本显示,支持富文本显示。在界面上只读,文字可以设置字号、字体、颜色、加粗、对齐等操作。

QGroupBox:分组框,可以放入一个控制统一管理。最常用的是放入:QRadioButton按钮,一组的按钮只能有一个被选中。

QxxxSilder:滑块有水平、垂直滑块,也可以当进度条使用。

QSpinBox:数字滑块与Silder的用法基本一致,只不过它是以数字显示。

Silder和SpinBox主要操作时:初值、最大值、进步值。即可以用来显示,也可以用来设置。

五、数据库创建


dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QButtonGroup>
#include <QDebug>
#include <QMessageBox>
// 引入数据库相关类
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QButtonGroup* group;
    QSqlDatabase db; // 数据库连接对象

    void connect2DB(); // 连接到数据库
    void createTable(); // 建表
    void insertData(); // 插入数据
    void deleteData(); // 按照编号删除
    void updateData(); // 按照编号更新
    void selectAll(); // 查询
    bool isDataExists(int id); // 判断某个id的数据是否存在
    void selectName(); // 按照姓名查询


private slots:
    void btnsClickedSlot(int); // 按钮组点击槽函数
};

#endif // DIALOG_H

dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    group = new QButtonGroup(this);
    group->addButton(ui->pushButtonInsert,1);
    group->addButton(ui->pushButtonDelete,2);
    group->addButton(ui->pushButtonUpdate,3);
    group->addButton(ui->pushButtonSelect,4);

    connect(group,SIGNAL(buttonClicked(int)),
            this,SLOT(btnsClickedSlot(int)));

    connect2DB();
}

void Dialog::btnsClickedSlot(int id)
{
    if(id == 1)
    {
        insertData();
    }else if(id == 2)
    {
        deleteData();
    }else if(id == 3)
    {
        updateData();
    }else if(id == 4)
    {
        selectName();
    }
}

Dialog::~Dialog()
{
    // 如果已经打开,则关闭数据库连接
    if(db.isOpen())
        db.close();
    delete ui;
}

void Dialog::connect2DB()
{
    // 获得连接对象
    db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库文件名称,扩展名可加可不加
    db.setDatabaseName("teacher.db");
    // 尝试打开数据库连接
    if(db.open())
    {
        qDebug() << "数据库连接打开成功!";
        createTable();
        selectAll();
    }else
    {
        // 拿到错误信息
        QString text = db.lastError().text();
        text.prepend("数据库打开失败!");
        // 展示错误信息
        QMessageBox::critical(this,"错误",text);
    }
}

void Dialog::createTable()
{
    // 建表语句
    QString sql = QString("CREATE TABLE teacher(\
                          id INTEGER PRIMARY KEY,\
                          name TEXT,\
                          sex  TEXT,\
                          age  INTEGER,\
                          mclass TEXT);");
    // 数据操作对象
    QSqlQuery sq;
    // 执行SQL
    if(sq.exec(sql))
    {
       QMessageBox::information(this,"提示","数据存储模块初始化成功!");
    }else
    {
       qDebug() << "建表失败:" << sq.lastError().text();
    }
}

void Dialog::insertData()
{
    QString name = ui->lineEdit->text();
    QString mclass = ui->plainTextEdit->toPlainText();
    if(name == "" || mclass == "")
    {
        QMessageBox::warning(this,"提示","请输入完整信息后再操作!");
        return;
    }
    int id = ui->spinBoxId->value();

    QString sex = "女";
    if(ui->radioButtonMan->isChecked())
    {
        sex = "男";
    }

    int age = ui->spinBoxAge->value();

    // 一个Oracle风格的预处理SQL语句
    const QString sql = "INSERT INTO teacher VALUES(:id,:name,:sex,:age,:mclass);";

    QSqlQuery sq;
    // 预处理SQL语句,此处默认都成功
    sq.prepare(sql);
    // 绑定参数,可以乱序
    sq.bindValue(":name",name);
    sq.bindValue(":id",id);
    sq.bindValue(":sex",sex);
    sq.bindValue(":mclass",mclass);
    sq.bindValue(":age",age);
    // 执行预处理的SQL语句
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","插入数据成功!");
        ui->spinBoxId->setValue(++id); // 方便下次插入,可以不做
        selectAll();
    }else
    {
        QString text = sq.lastError().text();
        text.prepend("插入数据失败!");
        QMessageBox::warning(this,"通知",text);
    }
}

void Dialog::deleteData()
{
    // 获得输入的编号
    int id = ui->spinBoxId->value();
    //删除先判断要删除的数据在不在
    if(!isDataExists(id))
    {
        QMessageBox::warning(this,"提示","要操作的数据不存在!");
        return;
    }

    // 预处理语句
    QString sql = "DELETE FROM teacher WHERE id=?";
    // 预处理
    QSqlQuery sq;
    sq.prepare(sql);
    // 绑定数据,多个必须按照?的顺序绑定
    sq.addBindValue(id);
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","删除数据操作成功!");
        selectAll();
    }else
    {
        QString text = sq.lastError().text();
        text.prepend("删除数据操作失败!");
        QMessageBox::warning(this,"通知",text);
    }
}

void Dialog::updateData()
{
    QString name = ui->lineEdit->text();
    QString mclass = ui->plainTextEdit->toPlainText();
    if(name == "" || mclass == "")
    {
        QMessageBox::warning(this,"提示","请输入完整信息后再操作!");
        return;
    }
    int id = ui->spinBoxId->value();

    QString sex = "女";
    if(ui->radioButtonMan->isChecked())
    {
        sex = "男";
    }

    int age = ui->spinBoxAge->value();

    // 判断要更新的数据在不在
    if(!isDataExists(id))
    {
        QMessageBox::warning(this,"提示","要操作的数据不存在!");
        return;
    }
    // 预处理的SQL语句
    QString sql = "UPDATE teacher SET name=?,sex=?,age=?,mclass=? WHERE id=?";
    // 预处理
    QSqlQuery sq;
    sq.prepare(sql);
    // 绑定
    sq.addBindValue(name);
    sq.addBindValue(sex);
    sq.addBindValue(age);
    sq.addBindValue(mclass);
    sq.addBindValue(id);
    if(sq.exec())
    {
        QMessageBox::information(this,"通知","更新数据操作成功!");
        selectAll();
    }else
    {
        QString text = sq.lastError().text();
        text.prepend("更新数据操作失败!");
        QMessageBox::warning(this,"通知",text);
    }
}

void Dialog::selectAll()
{
    // 清空上一次显示
    ui->textBrowser->clear();
    QString sql = "SELECT * FROM teacher";
    QSqlQuery sq;
    if(sq.exec(sql))
    {
        // 循环取出每个查询结果
        while(sq.next())
        {
            // 取出每列的数据
            QString id = sq.value(0).toString();
            QString name = sq.value(1).toString();
            QString sex = sq.value(2).toString();
            QString age = sq.value(3).toString();
            QString mclass = sq.value("mclass").toString();

            // 拼接
            QString text = id.append(" ")+name.append(" ")+sex.append(" ")
                    +age.append(" ")+mclass.append(" ");
            // 展示
            ui->textBrowser->append(text);
        }
    }else
    {
        QString text = sq.lastError().text();
        text.prepend("查询操作失败!");
        QMessageBox::warning(this,"通知",text);
    }
}

bool Dialog::isDataExists(int id)
{
    QString sql = "SELECT * FROM teacher WHERE id=?";
    QSqlQuery sq;
    sq.prepare(sql);
    sq.addBindValue(id);
    if(sq.exec()) // SQL语句本身执行是否成功
    {
        return sq.next(); // 直接把数据是否存在的结果返回
    }else
    {
        QString text = sq.lastError().text();
        text.prepend("查询操作失败!");
        QMessageBox::warning(this,"通知",text);
        return false;
    }
}

void Dialog::selectName()
{
    QString name = ui->lineEdit->text();
    if(name == "")
    {
        QMessageBox::warning(this,"提示","请输入要查询的关键字!");
        return;
    }

    ui->textBrowser->clear();
    // 注意通配符不要写在预处理语句中
    QString sql = "SELECT * FROM teacher WHERE name LIKE ?";
    QSqlQuery sq;
    sq.prepare(sql);
    sq.addBindValue(name.prepend("%").append("%"));
    if(sq.exec())
    {
        // 循环取出每个查询结果
        while(sq.next())
        {
            // 取出每列的数据
            QString id = sq.value(0).toString();
            QString name = sq.value(1).toString();
            QString sex = sq.value(2).toString();
            QString age = sq.value(3).toString();
            QString mclass = sq.value("mclass").toString();

            // 拼接
            QString text = id.append(" ")+name.append(" ")+sex.append(" ")
                    +age.append(" ")+mclass.append(" ");
            // 展示
            ui->textBrowser->append(text);
        }
    }else
    {
        QString text = sq.lastError().text();
        text.prepend("查询操作失败!");
        QMessageBox::warning(this,"通知",text);
    }
}

● void QSqlDatabase::setDatabaseName(const QString & name)

设置数据库名称,此函数会因为连接的数据库类型而有不同的含义,对于SQLite数据库而言,此函数的参数表示数据库文件的名称,这是因为SQLite数据库通过单文件存储。

● bool QSqlDatabase::open()

打开数据库连接,返回值是打开的结果。如果打开失败,会通过lastError函数返回错误信息;如果打开成功可以通过close函数关闭连接。

● bool QSqlQuery::exec(const QString & query)

执行SQL语句,参数是要执行的SQL语句,返回值是执行的结果。

如果执行错误,错误信息可通过QSqlError QSqlQuery::lastError() const函数获得。

增删改查

增删改查的过程中,对于一些数据需要从UI上获取,这些获取后,按照以往的方式需要与SQL语句进行拼接,在交给Qt去执行。这样的做法可以实现功能,但是存在一些缺点:

● 拼接时容易出错

● 容易出现安全问题

Qt中使用预处理+数据绑定的方式解决上述问题。

需要先编写预处理的SQL语句,与普通SQL语句的区别在于,先使用占位符对需要传入的数据进行替换,占位符有两种写法:

● Oracle风格

使用英文冒号与列名结合的方式,例如:name

优点是后续数据绑定时可以乱序

● ODBC风格

使用?

优点是写法更简单

相关函数如下。

● bool QSqlQuery::prepare(const QString & query)

预处理SQL语句,参数是符合格式的预处理语句,返回值是预处理结果。

Oracle风格的绑定函数,可以把参数绑定到预处理语句中。

参数1:占位符

参数2:占位符对应的值,QVariant兼容所有Qt常见类型

● bool QSqlQuery::exec()

执行预处理的SQL语句,返回值是执行的结果

● void QSqlQuery::addBindValue(const QVariant & val)

ODBC风格的绑定函数

参数:占位符对应的值

● bool QSqlQuery::next()

取出下一条记录,如果取出成功,则后移。

● QVariant QSqlQuery::value(int index) const

● QVariant QSqlQuery::value(const QString & name) const

取出当前记录的某列数据,参数是列序号,从0开始;参数是列名。

模糊查询可以做到只输入查询关键字的一部分就查询出符合格式的数据。

模糊查询使用关键字LIKE,配合两个通配符。

● %

匹配任意个数的字符

● _

匹配任意一个字符


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值