首页 > 其他分享 >Qt开发经验小技巧241-245

Qt开发经验小技巧241-245

时间:2022-08-31 09:26:09浏览次数:82  
标签:进制 database 数据库 245 241 new QSqlDatabase Qt

  1. QString类是我个人认为Qt所有类中的精华,封装的无可挑剔。内置了各种进制数据的转换,比如将数据转成10进制、16进制显示,或者将10进制、16进制数据转成字符串显示。这里很容易忽略的一点就是,很多人以为就是支持2进制、10进制、16进制之类的,其实不是的,里面实现了 2-36 之间的任意进制转换,可以自行翻阅源码查看实现。
char data[2];
data[0] = 0x10;
data[1] = 25;

//输出 2进制显示 "10000" "11001"
qDebug() << "2进制显示" << QString::number(data[0], 2) << QString::number(data[1], 2);
//输出 5进制显示 "31" "100"
qDebug() << "5进制显示" << QString::number(data[0], 5) << QString::number(data[1], 5);
//输出 10进制显示 "16" "25"
qDebug() << "10进制显示" << QString::number(data[0]) << QString::number(data[1]);
//输出 16进制显示 "10" "19"
qDebug() << "16进制显示" << QString::number(data[0], 16) << QString::number(data[1], 16);
  1. QtSql模块封装了各种数据库操作,使得Qt操作各种数据库非常的简单,支持各种各样的数据库,最基础的ODBC方式也支持连接到各种数据库。有个很容易忽视的要点就是在连接sqlserver数据库的时候,你会发现第三方的数据库工具也没有配置数据库,但是可以连接成功,而在Qt中的常规数据库连接写法却不行,那是因为你代码写错了,要用另外一种写法。
//连接sqlite数据库
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
//只需要指定数据库文件的绝对路径即可
database.setDatabaseName("d:/test.db");

//连接mysql数据库
QSqlDatabase database = QSqlDatabase::addDatabase("QMYSQL");
database.setDatabaseName("test");
database.setHostName("127.0.0.1");
database.setPort(3306);
database.setUserName("root");
database.setPassword("root");

//连接到sqlserver数据库
//方式一通过odbc数据源,前提是必须配置好数据源。
QSqlDatabase database = QSqlDatabase::addDatabase("QODBC");
database.setDatabaseName("数据源名称");
database.setUserName("sa");
database.setPassword("123456");

//方式二通过驱动字符串,无需配置数据源。设置数据库名称就带了主机地址端口和用户信息所有后面这些设置不需要,强烈建议推荐此方法。
QSqlDatabase database = QSqlDatabase::addDatabase("QODBC");
QStringList list;
list << QString("DRIVER={%1}").arg("SQL SERVER");
list << QString("SERVER=%1,%2").arg("127.0.0.1").arg(1433);
list << QString("DATABASE=%1").arg("test");
list << QString("UID=%1").arg("sa");
list << QString("PWD=%1").arg("123456");
database.setDatabaseName(list.join(";"));

//连接到postgresql数据库
QSqlDatabase database = QSqlDatabase::addDatabase("QPSQL");
database.setDatabaseName("test");
database.setHostName("127.0.0.1");
database.setPort(5432);
database.setUserName("postgres");
database.setPassword("123456");

//连接到oracle数据库
QSqlDatabase database = QSqlDatabase::addDatabase("QOCI");
database.setDatabaseName("test");
database.setHostName("127.0.0.1");
database.setPort(1521);
database.setUserName("system");
database.setPassword("123456");

//连接到人大金仓kingbase数据库(内核就是postgresql)
QSqlDatabase database = QSqlDatabase::addDatabase("QPSQL");
database.setDatabaseName("test");
database.setHostName("127.0.0.1");
database.setPort(54321);
database.setUserName("SYSTEM");
database.setPassword("123456");

//通过odbc数据源连接到各种数据库,前提是必须配置好数据源,只需要设置数据库名称为数据源的名称,填写用户名和密码就行,其他的主机地址和端口不需要。
QSqlDatabase database = QSqlDatabase::addDatabase("QODBC");
database.setDatabaseName("数据源名称");
database.setUserName("system");
database.setPassword("123456");
  1. 如果信号槽关联函数 connect(obj, SIGNAL(), this, SLOT()); 执行多次则会重复关联(意味着会执行多次),而取消信号槽关联函数 disconnect(obj, SIGNAL(), this, SLOT()); 只需要执行一次就可以将之前关联的(哪怕是重复关联过)全部清除。很多初学者会遇到为什么点一下居然执行多次的原因就在这里,很可能代码中写了 on_objName_clicked(); 这种Qt内置自动生成关联的槽函数,然后自己又在代码中调用 connect 绑定了一次,导致重复绑定。提个建议:其实Qt可以过滤下如果是完全一样的绑定则认为是一个而不是多个。
//为了保证永远只有一个关联可以在关联前面执行一次取消关联
disconnect(obj, SIGNAL(), this, SLOT());
connect(obj, SIGNAL(), this, SLOT());
  1. 通过对Qt自带Examples的源码研究你会发现,越往后的版本,越喜欢用智能指针QScopedPointer来定义对象,这样有个好处就是用的地方只管new就行,一直new下去,不用担心资源释放问题,智能指针会给你在合适的时机释放,相当于可以少些一行代码 xxx->deleteLater(); ,而且避免不必要的麻烦,不然很多地方你要判断 if (!xxx) 看下对象是否ok。
QWidget *widget;
//用的地方先new
widget = new QWidget;
//用完释放对象
widget->deleteLater();  
    
//智能指针写法
QScopedPointer<QWidget> widget;
//只管new尽管new不用管释放
widget.reset(new QWidget);
  1. 如果控件中存在布局,在调用setLayout重新设置布局的时候,会提示 QWidget::setLayout: Attempting to set QLayout ... 之类的信息,说是已经存在了布局,需要删除之前的布局才能重新设置布局,按道理Qt推荐的是调用 layout()->deleteLater() 方法去删除对象,更安全,但是在这里不起作用,你需要用 delete layout() 来删除,着实奇怪。

国内站点:https://gitee.com/feiyangqingyun
国际站点:https://github.com/feiyangqingyun

标签:进制,database,数据库,245,241,new,QSqlDatabase,Qt
From: https://www.cnblogs.com/feiyangqingyun/p/16641769.html

相关文章

  • QT网络编程【二】【Socket】
    1.QT中添加socket库的相关操作2.正常c++11VS2019使用socket库的操作3.winsock2与sys/socket.h的区别?4.WinSock2的基本操作?5.socket的创建参数的说明[]:http://t......
  • QT——状态栏添加label
    QLabel*state_msg=newQLabel(this);state_msg->setMinimumSize(state_msg->sizeHint());//设置label属性state_msg->setAlignment(Qt::AlignHCenter);//设......
  • Qt 浮点数比较
    计算机表示浮点数都有一个精度的限制,由于精度的限制会发生部分的截断,使得原本不相等的浮点数就变成了相等假设floatx=3.144444445,y=3.144444448从数学角度上看,x......
  • 编译qt时的gcc版本问题
    编译qt5.12.12源码,用gcc4.8.5可以编译qt源代码,没有编译xcbplugin,应该也能编译成功。(顺便说一句,编译xcb插件时需要libxkbcommon,而其又依赖于libxml2等类库和meson、ninja编......
  • modbus_rtu协议读取监测软件-大气废弃数据实时监控软件pyqt5
      串口发送数据:01030000001845c0串口接收数据:0103304242825d4223f4074113097740f7e08541569aa140f0654240ccedaf4283f0a442......
  • QT画图板
    QT画图板画图板简介一、 问题描述实现了画图板功能,可以使用铅笔自由绘制,以及绘制直线,矩形,椭圆,正方形,圆形等多种图形,还可以支持橡皮擦功能、变换画笔和填充颜色、变换画......
  • QT航空客运订票系统
    QT航空客运订票系统航空客运订票系统设计一、 问题描述实现航空系统客运订票的主要业务活动。例如,浏览和查询航班信息、机票预订和办理退票等。二、 功能描述需求分析......
  • QT项目二:局域网聊天工具
    QT项目二:局域网聊天工具参考《Qt及QtQuick开发实战精解》,该书介绍的很详细,不做过多介绍。末尾有源码下载地址1.main.cpp#include"widget.h" #include<QApplication> i......
  • qt 文件拖拽
    将某类型文件拖拽到qt窗口并执行相应动作。这里以播放某些文件为例。类继承自QWidget,重写函数:1voiddragEnterEvent(QDragEnterEvent*event)override;2vo......
  • QT UDP通信聊天程序(单播、广播、组播)
    QTUDP通信(单播、广播、组播)  日期:2021-03-26    浏览:126    评论:0    核心提示:1.QUdpSocketUDP是轻量的、不可靠的、面向数据报、无连接的协议,它可以用......