#Qt 租车系统遇到的一些小问题以及经验

1.两个窗口的切换

     运用signal 和 slot 在子窗口发射一个signal 父窗口接收之后 隐藏父窗口 显示 子窗口

    重点是在父窗口要包含子窗口头文件

    

//头文件subwidget类中定义signal
    
signals:
void mysignal();//注意signals和slot的类型必须一致 
 

  

//cpp中
  
connect(&b1,&QPushButton::released,this,&subwidget::senslot);//子窗口b1按下执行senslot 发射信号
void subwidget::senslot()
{
    emit mysignal();
    emit mysignal(250,"我是子窗口");
}


 

在主窗口中:

#include "subwidget.h"//包含子窗口的头文件

class mainwidget : public QWidget
{
    Q_OBJECT

public:
    mainwidget(QWidget *parent = 0);
    ~mainwidget();
    void changeWin();
    void dealsub();
private:
    subwidget son; //构造一个子窗口
};
connect(&son,&subwidget::mysignal,this,&mainwidget::dealsub);//接受子窗口发出来的信号  执行切换窗口

2.数据库的连接(转载)

连接时遇到一些警告

  如下:
 

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all

queries will cease to work.

QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

第一种是:

数据直接被加载到内存中了,当你定义的类被删除时,你应该在main.cpp文件中加载数据库而不是类中。

第二种是

把一切外围的对象都排除了:仅建立一个连接,打开它,然后关闭连接,调用removeDatabase()。居然还有警告!问题已经锁定在我关闭连接的语句上:

 
QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());

默认连接的名字也是默认的,需要通过connectionName()函数获得。这样写貌似没什么问题,后来调试发现,QSqlDatabase::database()静态函数实际上使默认连接的引用计数+1。上述句子相当于:

 
QSqlDatabase db = QSqlDatabase::database();//获得实例。
QString name = db.connectionName();//获得默认连接名。
QSqlDatabase::removeDatabase(name);//删除默认连接。

这样,问题就清晰了,db获得了一个引用,此时引用计数为2。在调用removeDatabase()时,db对象并没有被删除,默认连接的引用计数仍为2,于是报告警告信息。

我们只需将其改为:

 
    QString name;
    {
        name = QSqlDatabase::database().connectionName();
    }//超出作用域,隐含对象QSqlDatabase::database()被删除。
    QSqlDatabase::removeDatabase(name);

问题就解决了!

如果直接打默认连接名的话,代码就简单多了,不过名字不太好打(再说了,万一Qt把默认连接名改了呢!):

 
QSqlDatabase::removeDatabase("qt_sql_default_connection");//不推荐。

3.数据库的一些操作经验

     1、在定义sql语句时,强烈建议先把语句在数据库上操作一下,获得正确的结果定义完语句以防遗漏,比如sql中where = 'a'中的单引号还有where = 'a' ; 的分号都是非常容易丢失的。

     2、qt已经帮我们写好了许多操作数据库的函数,具体可以查看帮助文档。

     3、设置手动提交更改(非常有用)

model->setEditStrategy(QSqlTableModel::OnManualSubmit);
 
void CarWin::on_SureButton_clicked()
{
    model->submitAll();//提交
}

void CarWin::on_CancelButton_clicked()
{
    model->revertAll();//取消
    model->submitAll();//提交
}
4.TableView类的一些操作

   TableView是一种表格的类在使用数据库可视化的时候是一个非常有用的类,我们可以使用QSqlTableModel来更好的操作TableView.

    

    QSqlTableModel *model = new QSqlTableModel(this);
    model->setTable("car");//使用car表
    ui->tableView->setModel(model);//将model放到view上

表上就会按表格形式显示出Car表的信息.

TableView默认是允许修改的

可以设置不允许修改

  //不允许修改
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

通过

model->select();

可以刷新表但是要注意调用这个函数将恢复任何未提交的更改,并删除任何插入的列。


获得表中的数据需要通过索引

    //获取选中的模型
    QItemSelectionModel *sModel = ui->tableView->selectionModel();
    //模型中的索引
    if(sModel->hasSelection())
        //判断是否选择了某行
    {
        int row = sModel->currentIndex().row();
        qDebug() << row;
        //获得改行第3列的索引
        QModelIndex index = model->index(row,2);
        //获得索引的值
        QVariant price = model->data(index);
        qDebug() << price.toDouble();
    }
 

更改数据只需要

model->setData(index2,data);//index2是需要更改数据的索引,data是更改后的数据









    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值