CSS中!improtant的使用

本文探讨了CSS中使用!important声明样式时的优先级问题,并通过具体示例展示了不同浏览器下的表现一致性,特别关注IE6的特殊情况及解决办法。

CSS的原理:

我们知道,CSS写在不同的地方有不同的优先级, .css文件中的定义 < 元素style中的属性,但是如果使用!important,事情就会变得不一样。

首先,先看下面一段代码:





测试Css中的!Important区别


.testClass{
color:blue !important;
}



测试Css中的Important



虽然元素的style中有testClass类的定义,但是在上面的css定义中的用!important限定的定义却是优先级最高的,无论是在ie6-10或者Firefox和Chrome表现都是一致的,都显示蓝色。

这种情况也同时可以说明ie6是可以识别!important的,只是这个是ie6的一个缺陷吧。如果写成下面的样式,ie6是识别不出来的:

.testClass{
color:blue !important;
color:red;
}
这样,在ie6下展示的时候会显示成红色。

当然,也可以通过以下方式来让ie6识别:

.testClass{
color:blue !important;
}
.testClass{
color:red;
}

通过以上方式也是可以让ie6显示成蓝色的。

以上实例说明使用!important的css定义是拥有最高的优先级的。只是在ie6下出了一点小的bug,注意书写方式一般可以轻松避开的。

bool VehicleSpecificCharacteristics::saveDataToSQL(QString & errmsg) { //TODO:做具体实现 //获取时间 QString m_saveTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"); //TODO:获取被选中行的数据 QStandardItemModel *model = qobject_cast<QStandardItemModel*>(ui->dataTableView->model()); if (model) { int j = ui->dataTableView->model()->rowCount(); for (int i = 0; i < model->rowCount(); ++i) { QString DrwNo = model->data(model->index(i, 1)).toString(); QString Version = model->data(model->index(i, 2)).toString(); QString FeatureCode = model->data(model->index(i, 4)).toString(); QString Category = model->data(model->index(i, 11)).toString(); QString Drawinglocation = model->data(model->index(i, 13)).toString(); QString Specification = model->data(model->index(i, 17)).toString(); //QString Specification = QString::fromLocal8Bit("类型:几何公差,公差符号:*&00BF,公差值:*&00D81.5*&00CC,第一基准:D,第二基准:E,第三基准:F,上附加文本:M6,下附加文本:,左附加文本:,右附加文本:△● <54>,是否测点:true,尺寸id:48"); QString DimID ; int pos = Specification.indexOf("尺寸id:"); if (pos != -1) { DimID = Specification.mid(pos + 5); } SpecialSymbolSQLDataReplace(0, Specification); QString DataComparison = model->data(model->index(i, 18)).toString(); QString IsHandLost = model->data(model->index(i, 19)).toString(); QString tagID = model->data(model->index(i, 20)).toString(); QString isDetectingPoint = model->data(model->index(i, 21)).toString(); QString p_FeaturesNumber, d_FeaturesNumber; QString key, improtant; key = ui->rockNumLabel->text(); improtant = ui->rockNumLabel_2->text(); p_FeaturesNumber = key + '|' + improtant; key = ui->localNumLabel_1->text(); improtant = ui->localNumLabel_2->text(); d_FeaturesNumber = key + '|' + improtant; QString strSql, strSql1; QVector<QVector<QString>> dataTemp; strSql = QString::fromLocal8Bit("SELECT * FROM SpecialCharacteristic_Record_1 WHERE 图号='%1' AND 标识ID='%2'").arg(DrwNo).arg(tagID); bool anser = SqlServer::instance_->GetSQLData(strSql, dataTemp); if (true) { if (dataTemp.size() > 0) { strSql1 = QString::fromLocal8Bit("UPDATE SpecialCharacteristic_Record_1 SET 图纸版本='%1',类别 ='%2', 图纸位置 ='%3',规格 ='%4', 数据对比结果 ='%5', 是否手输 ='%6',是否测点='%7',磐石特性数量='%8',图纸特性数量='%9',用户='%10',保存时间='%11',尺寸ID='%12' WHERE 图号='%13' AND 标识ID='%14'").arg(Version) .arg(Category).arg(Drawinglocation).arg(Specification).arg(DataComparison).arg(IsHandLost).arg(isDetectingPoint) .arg(p_FeaturesNumber).arg(d_FeaturesNumber).arg(StrUserName).arg(m_saveTime).arg(DimID).arg(DrwNo).arg(tagID); } else { strSql1 = QString::fromLocal8Bit("INSERT INTO SpecialCharacteristic_Record_1 (图号, 图纸版本, 特性编码, 类别, 图纸位置, 规格, 数据对比结果, 是否手输,标识ID,是否测点,磐石特性数量,图纸特性数量,用户,保存时间,尺寸ID) VALUES ('%1', '%2', '%3', '%4', '%5', '%6','%7','%8','%9','%10','%11','%12','%13','%14','%15')") .arg(DrwNo).arg(Version).arg(FeatureCode).arg(Category).arg(Drawinglocation) .arg(Specification).arg(DataComparison).arg(IsHandLost).arg(tagID) .arg(isDetectingPoint).arg(p_FeaturesNumber).arg(d_FeaturesNumber) .arg(StrUserName).arg(m_saveTime).arg(DimID); } SqlServer::instance_->RunSQL(strSql1); } } }//TODO:这里没有对插入的错误判断 else { SqlServer::instance_->CloseServer(); return false; } return false; }解析该代码,是如何连接数据库的
最新发布
11-08
<think>我们注意到在代码中,数据库连接并不是在这个函数内部显式建立的。相反,它使用了一个名为 `SqlServer` 的单例类(通过 `SqlServer::instance_` 访问)来执行数据库操作。 具体来说: 1. 代码中没有创建数据库连接的语句(如没有 `QSqlDatabase::addDatabase` 等)。 2. 使用 `SqlServer::instance_->GetSQLData` 执行查询,使用 `SqlServer::instance_->RunSQL` 执行更新或插入。 3. 在函数末尾,当模型无效时,调用了 `SqlServer::instance_->CloseServer()`,这暗示 `SqlServer` 类管理着数据库连接。 因此,数据库连接是在 `SqlServer` 单例类内部管理的。在这个函数中,我们只是使用该单例对象来执行SQL语句,并没有直接创建连接。 下面详细解析: 关键代码片段: bool anser = SqlServer::instance_->GetSQLData(strSql, dataTemp); SqlServer::instance_->RunSQL(strSql1); 以及错误处理中: else { SqlServer::instance_->CloseServer(); return false; } 说明: - `SqlServer` 类很可能是一个单例类,通过静态成员 `instance_` 提供全局访问点。 - `GetSQLData` 方法用于执行查询,并将结果存储在 `dataTemp` 中(这是一个二维向量,可以理解为行和列的数据)。 - `RunSQL` 方法用于执行不返回结果的SQL语句(如INSERT、UPDATE等)。 - `CloseServer` 方法用于关闭数据库连接。 所以,数据库连接是在 `SqlServer` 类内部初始化和维护的。我们无法从这个函数中看到连接的具体细节(如连接字符串、认证信息等),这些细节被封装在 `SqlServer` 类中。 总结:该函数通过单例类 `SqlServer` 的实例来操作数据库,数据库连接由 `SqlServer` 类管理。 </think>### 代码数据库连接解析 该代码通过 `SqlServer` 单例类实现数据库连接和操作,具体连接机制如下: #### 连接核心机制 ```cpp SqlServer::instance_->GetSQLData(strSql, dataTemp); SqlServer::instance_->RunSQL(strSql1); SqlServer::instance_->CloseServer(); ``` 1. **单例模式访问** - `SqlServer::instance_` 表明使用单例设计模式 - 通过静态成员 `instance_` 获取全局唯一实例 - 确保整个应用共享同一数据库连接 2. **连接生命周期管理** - **隐式连接**:在调用 `GetSQLData()` 或 `RunSQL()` 时自动建立连接 - **显式关闭**:通过 `CloseServer()` 手动关闭连接(见错误处理部分) 3. **连接参数封装** - 数据库服务器地址、用户名、密码等参数封装在 `SqlServer` 类内部 - 调用者无需关心连接细节,只需调用接口方法 ### 连接流程分析 1. **首次调用时连接建立** ```cpp bool anser = SqlServer::instance_->GetSQLData(strSql, dataTemp); ``` - 单例对象首次调用时会读取配置文件或内置参数 - 自动创建数据库连接(可能是ODBC或直接驱动) - 连接保持活动状态供后续操作使用 2. **连接复用** ```cpp SqlServer::instance_->RunSQL(strSql1); ``` - 同一实例的后续调用复用现有连接 - 避免重复建立连接的开销 3. **异常关闭** ```cpp else { SqlServer::instance_->CloseServer(); return false; } ``` - 当模型无效时显式关闭连接 - 防止连接泄漏 ### 潜在连接特点 1. **连接池可能性** - 单例类内部可能实现连接池管理 - 可支持多线程环境下的连接复用 2. **参数配置位置** - 数据库连接参数可能存储在: - 类构造函数中硬编码 - 外部配置文件(如INI/XML) - 注册表或环境变量 3. **连接类型推测** 根据 `SqlServer` 类名判断可能是: - SQL Server 专用连接 - 封装了 `QSqlDatabase` 的通用SQL连接 - 自定义TCP/IP直连实现 ### 安全与性能考量 1. **SQL注入风险** - 当前代码直接拼接SQL字符串(`strSql = "SELECT ... '%1'"`) - 存在SQL注入漏洞,应改为参数化查询 2. **连接优化建议** - 避免在循环内频繁开关连接 - 添加连接心跳保持机制 - 实现连接异常自动重连
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值