Qt实战技能

快捷键:

多行注释:

选中多行---ctrl+/

打开文件或者类

ctrl+鼠标左键

find---replace

Ctrl+F

不会出现提示信息

对应的模块没有加入.pro文件中;

没有加入对应头文件;

模块加入.pro之后没有保存生效;

快速定义函数

右击一个函数

选择

注意:只有没有定义的函数Refactor才会有增加定义的选择,信号函数或者已经定义的函数没有增加定义的选项 

parent对象树

 

 自创建的类也会自动复合对象树:

中文出现乱码:

tool-->options

信号和槽

什么是信号和槽

connect(发送对象,信号,接收对象,槽函数),其中发送信号和槽函数需要用 SIGNAL() 和 SLOT() 来进行声明。

本质是什么

发送对象

就是发送信号的对象,比如按钮。

信号

就是特定的对象发送的事件,比如按钮发送的clicked(),本质上是一个函数。

接收对象

就是接受信号,并执行相应槽函数的对象,比如窗口。

槽函数

 信号和槽的规则

如果receiver是this表示什么

表示接受信号的对象是本窗口组件。

如果省略receiver表示什么

connect(ui->pushButton_todayPrice,&QPushButton::clicked,[=](){
    ui->stackedWidget->setCurrentIndex(0);
});

 利用lambda表达式实现槽函数

不需要接收对象,直接执行槽函数

信号和槽的建立

 ui文件怎么设置信号和槽

1,直接连接

2,转到槽函数

右键转到槽

比如将PushButton转到槽函数,就是选择这个按钮作为发射信号的对象,选择好信号的类型之后就会为中国信号建立一个槽函数。

转到槽,槽函数名称的建立

on+信号对象+信号类型(信号参数) 

UI界面实现信号和槽的原理

在UI界面进行的信号和槽的建立不需要自己去连接信号和槽,ui界面实现的功能都会在ui_x.h文件进行代码转换

代码实现信号和槽

连接信号和槽

connect(sender,signalType,receiver,signalDeal);

槽就是signalDeal----信号处理函数

sender----就是发送信号的按钮

connect(btn1,&QPushButton::clicked,this,&QPushButton::close);

注意第二和第四个参数

自定义信号和槽

信号自定义:

槽函数自定义:

 5.6以上版本都可以

先连接再触发信号,而不是先触发再连接:

信号的触发--emit:

给槽函数传递参数

当有重载函数时

定义不同类型的函数指针指向各个重载函数地址,无论是信号,还是槽函数,只要是有重载就要定义函数指针,利用函数指针关联起来信号和槽。

以函数指针作为信号函数和槽函数

函数指针一定要用信号和槽所属的对象进行修饰

 

取函数地址的两种方法 

 当没有重载函数时

不需要函数指针,即使用参数,直接发送信号的时候传参就可以

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    connect(ui->buttonOk,&QPushButton::clicked,this,&Widget::onBtnClicked);
    connect(this,&Widget::mysignal,this,&Widget::dealUserSignal);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onBtnClicked()
{
    QString str = ui->lineEdit->text();

    if(str.isEmpty())
        return ;

    emit mysignal(str);  //发送信号
}

void Widget::dealUserSignal(QString s)
{
    qDebug() << "offer = " << s;
    ui->labelOffer->setText(s);


    //正常我们按下取消键盘的时候,lineedit上的数据会被清除,那么我们来断开取消按钮和槽函数的链接
    disconnect(ui->buttonCancel,SIGNAL(clicked()),this,SLOT(on_buttonCancel_clicked()));
}

//按下取消按钮的时候
void Widget::on_buttonCancel_clicked()
{
    ui->lineEdit->clear();
}

QString输出有引号:

解决: 

connect和disconnect

connect是按键和槽函数建立连接后保持连接

disconnect断开按键和槽函数的连接,让按键不能操作这个槽函数 

信号和槽函数之间的连接权限

::和SIGNAL(),SLOT()的区别

强大的转到槽函数

要求无返回值

转到槽之后不需要连接

添加资源文件

步骤

添加前缀的意义只是为了区分不同类型的资源文件。

 注意:选择图片之后要进行保存(ctrl+s),只有保存,才会加入资源文件中,否则是没有添加成功的,成功会显示在Resources的下面。

资源文件一定要和项目文件在同一个目录下吗

窗口设置

resize(宽,高);

设置着窗口的大小

resize设置的窗口可以拖动改变大小

还可以设置固定的高,合作固定的宽,合作固定的高和宽

按钮设置

QPushButton

一定要定义为指针变量

按钮位置指定:move(距离左边x,距离上边y),不可以设置负数,否者就跑到左边的左边了,看不到

x向右为正,y向下为正

pushbutton具有的函数可以自己查看,但是要知道有那些常用的

设置未知--move

设置按钮的文字的setText()

设置大小resize()

pushbutton如果创建之后没有指定位置,则在(0,0)处。

文本框 

获取文本框的内容的函数

 QString str = ui->lineEdit->text();

设置文本框内容

ui->lineEdit->setText(QString);

错误,警告,提示对话框

QMessegeBox::warning();

QMessegeBox::critical()

QMessageBox::information()

QMessageBox::qustion()

注意第一个参数是一个QWidget基类对象指针,一般设为nullptr

 

 二选一的消息对话框---question()

含有两个按键,怎么知道是按下了哪一个呢------通过返回值

    //提示是否确认修改数据
    QMessageBox::StandardButton btn;
    btn=QMessageBox::question(nullptr,"提示","确定要修改数据吗",QMessageBox::Yes|QMessageBox::No);
    if(btn==QMessageBox::No)
        return;

主窗口设置

删除标题栏

    //设置窗口固定大小
    setFixedSize(582,320);
    //去出窗口标题栏
    this->setWindowFlags(Qt::FramelessWindowHint);

设置窗口标题

ui界面设置

选中窗口,搜索windowTitle属性修改就行。

代码实现

setWindowTitle("first W");

两者都设置结果是代码设置的结果

为标题添加图片

选择choose resource...

刷新选择图片

主窗口其他基本操作

菜单栏和工具栏,状态栏,浮动窗口

注意:要使用这三个工具,要选择QMainWidget类,其他类没有这三个工具

QWidget:

菜单栏

代码实现

menuBar()

返回菜单栏指针,如果不存在就创建再返回

c菜单栏的创建默认是放入窗口中的,所以不用传递this

菜单项怎么和行为关联

 上面的指针在局部定义也可以,因为作用域只是对变量限制,对开辟的内存不影响。

菜单栏-->菜单-->菜单项

每一个都是一个指针

工具栏

工具栏中可以放置哪些工具

可见,只要是从Qwidget继承的控件都可以 

状态栏

 菜单栏,工具栏,状态栏的添加和删除都可以用代码来实现,但更方便的是直接在ui文件中添加和删除

浮动窗口(铆接部件)---DockWidget

设置窗口中心部件的函数

 只有菜单栏和状态栏用函数获取,其他的都要new

这些部件有些可以有多个,有些只能有一个

创建好之后add的可以有多个:工具栏,铆接部件,

创建好之后set的只能有一个:菜单栏,状态栏,中心部件

ui中直接设置菜单栏,工具栏,状态栏

菜单栏

直接双击菜单栏

为菜单项添加图标

一般添加图像,都是选择组件的xxxIcon属性

 在action editor行为编辑中为菜单项添加对应的行为

在菜单栏直接输入不了汉字,需要在行为编辑框中修改

关联菜单项行为

转到槽

 

状态栏

工具栏

工具栏的工具怎么添加

菜单项和工具都可以用代码添加或者直接拉action editor中的action

 dockWidget

代码实现添加资源文件到项目中并设置

注意:文件路径一定要是从前缀到文件名

模态对话框和非模态对话框

点击工具栏弹出对话框的操作实现 

(QMessageBox)对话框--dialog

消息对话框 

QMessage::question

含有两个按键,怎么知道是按下了哪一个呢------通过返回值

颜色对话框

文件对话框

显示指定目录或者文件下的所有文件和目录

 仅显示指定文件,使用第四个参数

注意:文件对话框返回值是选取的文件的路径

字体对话框

字体对话框中具有的属性是你的系统配置拥有的,可以通过返回的对象获取用字体对话框设置的字体属性。 

界面布局

布完局,拖动窗口,里面的部件就可以变化了

添加图片

以上两种图片添加的方式的区别

 border-image:图片包含在整个框内

background-image:图片会消逝一部分

弹簧

弹簧的失效

弹簧的使用原则------先布局再添加

弹簧固定高度和宽度设置 

弹簧边界调整

用于布局的框太大了

标题栏标题的修改 

 

 固定窗口大小

 

 密码(输入数据)的显示格式

同排分散,拉不到一起

方法

布局的原则

从小的布局到大的

对于有多页的组件,要点击每页页头进行布局

每一个布局框中的小组件布局之后都是对齐的,不要对子组件的部分进行布局,这样会导致对不齐 

布局比列调整

布局宽度和高度

大小基本相同的,布局之后相同,需要自己调整 

label---标签

label不仅可以用来显示文字还可以用来显示静态图片和动态图片等

显示静态图片设置

设置的图片不能显示完全

    //图片的保存和显示
    QSqlQuery query(m_db);
    //获取房间图片,保存用来显示
    if(!query.exec("select roomPixma from ROOMPRICE"))
    {
        QMessageBox::information(nullptr,"提示","没有插入图片");
        return;
    }
    query.first();
    m_pixByteArray=query.value(0).toByteArray();
    QPixmap outPixmap;
    outPixmap.loadFromData(m_pixByteArray);
    outPixmap=outPixmap.scaled(ui->label_picture->size());
    ui->label_picture->setPixmap(outPixmap);

注意这两段代码:
outPixmap.loadFromData(m_pixByteArray);
outPixmap=outPixmap.scaled(ui->label_picture->size());
一定要先设置QPixmap对象的文件路径或者图片内容,再设置大小才有用。

显示动态图片设置

直接ui设置,但是这种只能设置静态图

label边框设置

frameshap设置边框粗细

frameshadow设置边框突出或者凹陷

右键给label添加图片

右键-----change style sheet

QT向一个组件设置数据以及获取一个组件数据的函数规律

设置:setXX()

获取:xx()

eg:setText()----text(),setValue()--value()

分组框----group box

button

push button

不用代码直接给按钮上图

按钮转到槽的功能

用者功能就可以直接差法按钮,而不需要再触发自己定义的信号和槽了,除非有需要。

直接转到槽就可以直接显示其他窗口。

pushbutton布局之后的位置修改

布局之后再会出现红框,表示可以选择放入的位置

toolButton

设置toolButton的文字和图片都可见

toolbutton默认是只显示图片的

在text属性中设置文字之后,需要选择以上属性设置才可以看到文字和图像 

toolbutton捕捉鼠标 

radio button---单选按钮

这种按钮一般和group box(组合框一起使用)

 

也可以直接双击修改

设置默认选中

注意:不是setCheckable(bool)

按钮显示文本的修改和按钮编程使用名称的修改

按钮显示文本的修改

 按钮编程使用名称的修改

选中一个按钮之后触发操作

获取当前选中的按钮

先将所有按钮设置为一组

 获取

QString permission=ui->buttonGroup_permission->checkedButton()->text();

三种按钮作用

check box--多选按钮

获取所有选中的按钮

窗口类部件

dock widget---挂件

dailog----会话框

小部件项

List widegt--列表组件

设置每行信息 

设置文字对齐方式--setTextAlignMent()

tree widget

ui方式实现

 

代码方式实现

QTableWidget--表格控件

设置每列列头信息

设置每行行头信息

其他一些设置方法

tableWidget直接设置方法----双击设置 

tableWidget行头列头隐藏

tablewidget设置单元格背景颜色

    for(int i=0;i<5;++i)
    {
        for(int col=0;col<6;++col)
        {
            ui->tableWidget_roomInfo->item(i,col)->setBackgroundColor(QColor(22, 169, 81));
            ui->tableWidget_roomInfo->item(i,col)->setForeground(Qt::red);
        }
    }

注意:单元格被设置的数量和位置一定要和开辟的第一个个数一样,否则;

关于tablewidget调用item出现内存泄漏问题

来源------链接

出错代码
通过qtDesigner新建了一个QTableWidget对象,设置6行7列,然后我就通过如下方式进行item内容的设置

for(uint8 i=0;i < ui->tableWidget->rowCount();i++)
{
	for(uint8 j=0; j < ui->tableWidget->columnCount();j++)
	{
		ui->tableWidget->item(i,j)->setText(QString("%1 %2").arg(i).arg(j));
	}
}

出现了segmentfault,内存段错误。

原因分析
显然是出现了非法内存调用,查找发现,QTableWidget,表格与单元格是分开的,创建了表格(定义好了行列数)并不会相应创建单元格Item.
在使用时需要先实例化Item

正确代码
需要在初始实例化阶段对Item进行实例化

//初始化阶段
for(uint8 i=0;i < ui->tableWidget->rowCount();i++)
{
	for(uint8 j=0; j < ui->tableWidget->columnCount();j++)
	{
		ui->tableWidget->setItem(i,j,new QTableWidgetItem(""));	//实例化一个Item,显示内容为“”
		ui->tableWidget->item(i,j)->setTextAlignment(Qt::AlignCenter);//设置对齐方式
	}
}

然后就可以正常使用了,只需要在初始化时实例化一次

//使用阶段
for(uint8 i=0;i < ui->tableWidget->rowCount();i++)
{
	for(uint8 j=0; j < ui->tableWidget->columnCount();j++)
	{
		ui->tableWidget->item(i,j)->setText(QString("%1 %2").arg(i).arg(j));
	}
}

也就是说要使用的第一个使用之前一定要先创建

tablewidget单元格内容换行显示

换行符一定要在QString中才有用 

tablewidget文字居中

    for(int i=0;i<5;++i)
    {
        for(int col=0;col<6;++col)
        {
            ui->tableWidget_roomInfo->item(i,col)->setTextAlignment(Qt::AlignHCenter|Qt::AlignCenter);
        }
    }

container中的部件

scroll area--滚动区域

tab widget

设置默认显示页

    //设置默认显示页
    ui->tabWidget->setCurrentIndex(0);

stackWidget--多页面实现图形化

设置stackwidget的默认显示界面

这个stackwidget中的页面通过按钮来设置对应的显示

1,直接按钮--go to slot

2,connect()

下拉框

下拉框选项设置

1,ui直接设置

2,

下拉框的选项也是有下标的 

tableview和model---视图和模型和数据库

 

视图,模型和数据库之间的关系

如果不设置视图为不可编辑

那么可以通过视图修改模型,从而修改数据库中的值

模型提交方式设置:

    //设置模型提交方式为手动提交
    m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);

设置为手动提交之后,利用按钮使用submitAll提交,看下面代码

设置tableView隐藏某一列

tableView基础设置

 

没有提交之前才可以撤销

 

 

利用模型进行数据查询

  

设置列头或者行头隐藏

 

stacked widget --栈控件

可以在不同的页设置不同的组件

注意“左右按键”只是为了设置时方便,不是切换的按钮,切换的按钮需要自己设置

栈控件怎么增加页

1,右键点击右上角的小三角

2,有一个insert page

可以选择向前,向后插入页

怎么知道当前在那一页

下拉框--combo box

条目的增加可以ui设计中直接设置,或者用函数设置

addItem()或者addItems()

按钮设置下拉框条目

获取下拉框文字

QString roomNum=ui->comboBox_roomNum->currentText().remove(QRegExp("\\s"));

下拉框设置为槽函数

    void SqlDataWidget::on_comboBox_manager_currentIndexChanged(int index)
    {
    QSqlQuery query(m_db);
    //查询员工信息,然后填充到对应控件
    QString managerName=ui->comboBox_manager->currentText().remove(QRegExp("\\s"));
    //因为当删除所有员工进行再次填充时,下来控件也会检测到,所以当删除时,这个控件检测到就直接退出
    if(managerName.size()==0)
        return;
    QString str=QString("select UserName,password,sex,ID,birthdate,PhoneNum,address,email from ROOTINFO where UserName='%1'").arg(managerName);
    if(!query.exec(str))
    {
        QMessageBox::information(nullptr,"提示","没有查询到该员工信息");
        return;
    }

文档编辑的组件

还有很多其他图标--看图识别

数组滚动条和水平滑块的结合使用

代码实现两者关联

1,connect

2,直接go to slot

自定义控件和控件关联

自定义控件文件

新增三个文件 

关联不同组的控件

关联之前的准备工作

1,在主控件选择和子控件所有控件所在控件一样的控件。

1,复制子控件文件类名

2,右键以上组件----promote(提升为) 

基类要相同才可以提升

所谓的基类相同就是主控件选择的提升子控件的控件要和子控件所使用的控件一样

需要修改三个地方---三个基类的地方

被提升的控件当需要时可以直接使用

widget

widget中的内容怎么居中

QDockWidget-----小部件

链接

提升的注意事项

被提升的组件也是一个个的对象,不要和在父类中定义同类型的对象混淆,自认为是同一个了。

提升的对象如同按钮可以使用

(ui->)

小部件怎么进行功能设置

1,小部件建立自己的.cpp, .h, .ui文件,然后在主部件中提升

2,小部件建立自己的.cpp, .h,文件,在主部件中ui文件中画出,再提升

不同文件之间不需要包含,只需要在ui文件中提升进入,就可以通过这个用来提升的组件访问或者设置其他ui文件中的组件

不同ui文件怎么切换显示

要显示必须先建立对象,然后在合适的地方--.show()

事件---Qevent

键盘和鼠标

鼠标和键盘的函数都是虚函数,需要的时候重写就可以了,通过QEvent或者QEvent的派生类来捕捉事件。

键盘是#include <QKeyEvent>

鼠标是#include <QMouseEvent> 

鼠标和键盘的press和release

直接加入头文件,重写就可以使用。

键盘或者鼠标的的事件通过参数传递给函数

《Qt编程快速入门》

获取键盘字符

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    switch(event->modifiers()){
    case Qt::AltModifier:   ui->lineEdit->setText(QString("key=%1").arg(QChar(event->key())));
    case Qt::ShiftModifier: ui->lineEdit->setText(QString("key=%1").arg(QChar(event->key())));
    default:ui->lineEdit->setText(QString("key=%1").arg(QChar(event->key())));
    }
}

上面的程序在扯淡
void MainWindow::keyPressEvent(QKeyEvent *event)
{
   ui->lineEdit->setText(QString("key=%1").arg(QChar(event->key())));
}

鼠标的进入和离开检测

enterEvent(QEvent *event)

leaveEvent(QEvent *event)

无需调用,只需要声明和定义,会自动捕获鼠标事件

在哪个组件中定义的这两个函数,那么这两个组件就对这整个组件有作用

只能检测鼠标的进入和离开

鼠标的按下释放和移动

要怎么使用才有用

鼠标位置获取

鼠标左右键的选择

鼠标事件也包含在QMouseEvent中

不一定是释放函数,主要是QMouseEvent参数 

move如果不检测按键,鼠标移动他也可以追踪得到 

为什么鼠标的事件不可以用switch进行判断

鼠标事件的所有值都定义在枚举类型中

设置鼠标追踪

构造函数中

设置鼠标在按键上的左右键检测

(按键检测鼠标左右键)

鼠标button()和buttons()的区别

void MouseLable::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton) qDebug()<<"press leftButton";
}

void MouseLable::mouseReleaseEvent(QMouseEvent *ev)
{
    if(ev->buttons()&(Qt::LeftButton|Qt::RightButton)) qDebug()<<"press leftButton and rightButton";
}

button

只能获取鼠标的单个事件

buttons

可以获取鼠标的组合事件

定时器--tiemerEvent

定时器可以用来做什么

定时进行某些操作

怎么建立一个定时器

建立定时器的两种方式

1,重写虚函数实现

定时器和鼠标和键盘一样,Qt通过虚函数实现对定时器的操作,通过事件进行事件检测。所以重写timerEvent()函数就是建立定时器。

怎么样进行定时

怎么样开启定时

为什么以下代码定时器不会走

重新执行定时器函数时i一直都是0 

定时器执行的原理

间隔一段事件,重新执行一次定时器函数

有多个定时器时怎么设置指定定时器

timerId值

类中定义timerId变量接收startTimer()返回ID。

startTimer()会返回开启哪个定时器的ID,定时器的执行函数参数类会捕获定时器的ID

 2,定义QTimer类定时器

定时器怎么暂停

怎么启动--start()

中间层的事件过滤器

什么是事件分发

就是事件分发之前先就是通过一个分发器也就是event函数先获取事件,获取的事件是可以在event中选择要不要向下分发给对应的对象处理,以及对捕获的指定事件在分发之前做处理。

事件分发

什么是事件过滤

就是事件从捕获到传给event分发器使用之前,可以先通过eventFilter过滤器先过滤,获取指定事件进行处理。

事件过滤器的设置

 过滤器eventFilter或者分发器event返回true表示这个事件已经拦截处理,不需要再向下分发

中间层的事件分发器

 绘画事件---paintEvent()

<QPainter>

使用画家添加图像 

paintEvent()的再次调用

调用repaint()或者update()

绘图设备

QPixmap

#include <QPixmap>

#include <Qpainter>

    //创建QPixmap绘图设备(幕布)
    QPixmap pix(400,400);
    //设置幕布背景颜色
    pix.fill(Qt::blue);
    //建立画家
    QPainter painter(&pix);
    //设置画家画笔的颜色
    painter.setPen(QPen(Qt::red));
    //使用椭圆画圆
    painter.drawEllipse(QPoint(200,200),50,50);
    //pix.save(":\\image\\ellipse1.png");
    pix.save("D:\\QT\\QTlearn\\paintdevice\\image\\ellipse.png");//使用绝对路径

 QImage

注意:以上两种绘图不会显示在输出窗口,因为我们指定画家的绘画窗口是我们自己定义的其他窗口,并且保存在文件中。

指定在输出窗口绘画

修改像素 

QSS

一个函数进行样式设置

this->setStyleSheet();

标准QT库中qss的使用方法:

建立一个.qss文件,在.qss文件中设置样式

然后通过打开文件--->使用文件的方式设置样式

学生管理系统

登录界面添加标题图片

标题图片显示结果

窗口的提示设置

提示设置显示结果 

窗口分辨率设置

分三块布局 

每一个块或者组件的高度和宽度设置

要先固定,再设置最大,最小值

如果是指定大小,那最大最小值都要是同一个值才会变为设置的值

如果只设置最大值或者最小值,那么其大小就是最小最大值之间的值

 文字的设置

文字对齐 

 

设置默认隐藏显示内容 

密码位数限制

主窗口的.h文件包含子窗口的.h文件,并建立子对象

不显示主界面

按键转到槽 

登录窗口触发信号

  

当从数据库获取数据成功,触发信号,在父窗口中设置信号和槽的连接,只要信号触发,就显示主窗口、

主窗口信号和槽设置

main.cpp中包含子ui文件的.h文件

关闭显示窗口

qss--样式设置

进行样式设置时,不能同时设置背景图片和样式颜色,同时设置会导致样式无法看到。

按钮样式设置:

按钮的背景颜色设置的时候看不到,运行之后才看得到

使用元素选择器选择区域内的所有对象

QT和数据库

qt +=sql   //加入之后先编译

#include <QSqlDatabase>
#include <QtWidgets>
#include <QtSql>

数据库头文件

#include <QSqlDatabase>
#include <QtSql>
#include <QtWidgets>
QMessageBox::critical(nullptr,"error","linked failed"+m_db.lastError().text();

这一句要有---#include <QtSql>头文件

查询

//1
    query.prepare("update consumerInfo set stayState='已退房' where roomNum=?");
    query.bindValue(0,roomNum.toInt());
    if(!query.exec())
    {
        QMessageBox::critical(nullptr,"错误","客户入住信息没有修改成功");
        return;
    }

//2
    QString strOutTime=QString("update consumerInfo set checkOutTime='%1' where roomNum=%2").arg(checkOutTime).arg(roomNum.toInt());
    if(!query.exec(strOutTime))
    {
        QMessageBox::critical(nullptr,"错误","客户退房时间没有修改成功");
        return;
    }

以上两种方式尽量使用第二种,第一种会莫名其妙地错误

db.open()

数据库的open()函数返回bool类型的值

数据库使用完之后关闭

db.close();

这个在析构函数中使用

数据库的连接和创建

//1 
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("D:\\QT\\QTlearn\\studentsystem\\studentdatabase.db");
    if (!db.open())
        QMessageBox::warning(nullptr, "error","linked failed"+db.lastError().text());

//2
 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("studentdatabase.db");
    if (!db.open())
        QMessageBox::warning(nullptr, "error","linked failed"+db.lastError().text());

setDatabaseName

如果这函数指定的路径下有这个文件,就连接这个文件。

如果没有这个文件或者仅仅指定了这个文件,就在build......文件中建立这个文件,并连接这个数据库。

指定查询语句中的某个量

方法1:使用占位符---?

方法2: 使用:和字符

      QSqlQuery query;
      query.prepare("INSERT INTO person (id, forename, surname) "
                    "VALUES (:id, :forename, :surname)");
      query.bindValue(0, 1001);
      query.bindValue(1, "Bart");
      query.bindValue(2, "Simpson");
      query.exec();

exec()

只是判断查询语句知否执行成功

获取查询的返回值

      QSqlQuery query("SELECT * FROM artist");
      int fieldNo = query.record().indexOf("country");
      while (query.next()) {
          QString country = query.value(fieldNo).toString();
          doSomething(country);
      }

value的值可以是下标值,也可以是查询的字段名称

批量插入数据

 QSqlTableModel

model----只负责存储数据

view------只负责显示数据 

tableView和tableModel的使用过程

建立对象

 前四步就可以获取并且显示数据

注意:这个模型和试图是对数据库的操作,所以要和数据库在同一个文件 

往数据库插入图片

    QFile file("D:/QT/homework/SmartHotelProject/Code/hotelsystem/image/childRoom.jfif");
    if(!file.open(QIODevice::ReadOnly))
        return;
    else qDebug()<<"文件打开成功";
    QByteArray pixByteArray=file.readAll();

    QSqlQuery query(m_db);
    query.prepare("update ROOMPRICE set roomPixma=:pix where ID=2");
    query.bindValue(":pix",pixByteArray);
    if(!query.exec())
    {
        QMessageBox::information(nullptr,"提示","插入图片失败"+query.lastError().text());
        return;
    }
    else
        qDebug()<<"插入成功";

而且使用绝对路径,未使用相对路径没有用

 QT类型转换

int转Qstring

没有QString对象接收

QString::number(int)

有QString对象接收

int num=100;

QString str;

str.setNum(num);

QString转int

QString对象的函数toInt() 

QString

 去除引号

去除空格

头文件---

#include <QRegExp>
 str=ui->spinBox_count->text();
 str.remove(QRegExp("\\s"));

QT中的数学操作

 QT随机数的生成

在QT程序中,生成随机数比较简单。两个函数:
    void qsrand(uint seed);
    int qrand();


首先是初始化:qsrand()

qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

接下来就可以生成随机数了:

int a = qrand();

qrand()理论上返回0 到 RAND_MAX间的值。

如果要返回0~n间的值,则为:qrand()%n;

如果要返回a~b间的值,则为:a + qrand() % (b - a)

不设置qsrand,qrand默认从1开始

1~35

    for(int i=0;i<7;++i)
    {
        vecn.append(qrand()%35);
    }

时间获取和设置

一、时间日期类型:
QTime:时间数据类型,表示时间,如:14:23:13。
QDate:日期数据类型,表示日期,如:2020-4-5。
QDateTime:日期时间数据类型,表示日期和时间,如:2020-03-23 08:12:43。
QDateTime:

QDateTime dateTime= QDateTime::currentDateTime();//获取系统当前的时间

QString str = dateTime .toString("yyyy-MM-dd hh:mm:ss");//格式化时间
复制
QString转化为QDateTime:

QString str= "2020-11-02 12:24:36";
QDateTime time = QDateTime::fromString(str, "yyyy-MM-dd hh:mm:ss");
复制
字符串转换为 QTime、QDate 、 QDateTime 类型,使用静态函数 QDateTime::fromString(),其函数原型为: QDateTime QDateTime::fromString(const QString &string, const QString &format)
第 1 个参数 string 是日期时间字符串形式,第 2 个参数 format 是字符串表示的格式

当前时间转化为时间戳:
QDateTime time= QDateTime::currentDateTime();//获取系统当前的时间
uint nTime = time.toTime_t();
复制
时间戳转化为当前时间:

//这个方法是静态的
QDateTime time = QDateTime::fromTime_t(timeT);
复制
二、 qt中用于时间、日期编辑和显示的界面组件
QTimeEdit:编辑和显示时间的组件。
QDateEdit:编辑和显示日期的组件。
QDateTimeEdit:编辑和显示日期时间的组件。
QCalendarWidget:用日历形式选择日期的组件。
    //获取当前日期时间,设置日期时间数据,并转换为字符串
    QDateTime curDateTime=QDateTime::currentDateTime();

    ui->timeEdit->setTime(curDateTime.time());
    ui->editTime->setText (curDateTime.toString ("hh:mm:ss));
    ui->dateEdit->setDate(curDateTime.date());
    ui->editDate->setText(curDateTime.toString("yyyy-MM-dd"));
    ui->dateTimeEdit->setDateTime(curDateTime);
    ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"))
复制
QDateEdit 和 QTimeEdit 都是从 QDateTimeEdit 继承的,实现日期或时间的特定显示功能。实际上,QDateEdit 和 QTimeEdit 的显示功能都可以通过 QDateTimeEdit 实现,只需设置属性即可。

将字符串填充进入dateEdit

ui->dateEdit_m_birthDate->setDate(QDate::fromString(query.value(4).toString()));

其他细节

移除空格

//移除空字符后得到账号和密码
QString  username=ui->usernameTextLineEdit->text().remove(QChar('\040'),

Qt::CaseInsensitive);

QString password = ui->passwordTextLineEdit->text().remove(QChar('\040'), 

Qt::CaseInsensitive);

1,setText的参数必须是字符串才可以写入

.pro文件中加入内容

比如:QT += sql

加入之后要先编译,才有效果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值