网站文章内容,互联网保险理赔到底有多难,wordpress term group,织梦 网站统计QStringList-存储和管理一系列的字符串
在Qt框架中#xff0c;QStringList 是一个模板类 QListQString 的特化#xff0c;专门用于处理 QString 对象#xff08;即Qt中的字符串#xff09;的列表。当你看到这样的声明#xff1a;
QStringList m_rec_topicList; …QStringList-存储和管理一系列的字符串
在Qt框架中QStringList 是一个模板类 QListQString 的特化专门用于处理 QString 对象即Qt中的字符串的列表。当你看到这样的声明
QStringList m_rec_topicList;
这里m_rec_topicList 是一个 QStringList 类型的变量用于存储和管理一系列的字符串QString 对象。以下是对 QStringList 在这个上下文中的详细讲解
一、基本特性
类型QStringList 是 QListQString 的一个特化因此它继承了 QList 的所有功能并针对字符串进行了优化。存储QStringList 内部使用动态数组来存储字符串这意味着它可以根据需要自动调整大小。线程安全QStringList 本身并不是线程安全的。如果在多线程环境中使用需要采取适当的同步措施。
二、主要功能
添加和移除字符串 append(const QString str)在列表末尾添加一个字符串。prepend(const QString str)在列表开头添加一个字符串。insert(int i, const QString str)在指定位置插入一个字符串。removeAt(int i)移除指定位置的字符串。removeOne(const QString str)移除列表中第一次出现的指定字符串。removeAll(const QString str)移除列表中所有出现的指定字符串。访问字符串 at(int i) const返回指定位置的字符串带边界检查。operator[](int i) const返回指定位置的字符串不带边界检查如果索引超出范围结果未定义。first() const返回列表中的第一个字符串。last() const返回列表中的最后一个字符串。value(int i, const QString defaultValue QString()) const返回指定位置的字符串如果索引超出范围则返回默认值。遍历 可以使用 foreach 循环Qt特有的语法糖或基于范围的 for 循环C11及以后来遍历 QStringList。排序 sort(Qt::SortOrder order Qt::AscendingOrder)对列表进行排序可以指定升序或降序。查找 indexOf(const QString str, int from 0) const返回指定字符串在列表中第一次出现的索引从指定位置开始搜索。lastIndexOf(const QString str, int from -1) const返回指定字符串在列表中最后一次出现的索引从指定位置开始向后搜索如果 from 为 -1则从列表末尾开始搜索。contains(const QString str, Qt::CaseSensitivity cs Qt::CaseSensitive) const检查列表中是否包含指定字符串可以指定是否区分大小写。连接和分割 join(const QString separator) const将列表中的字符串连接成一个字符串使用指定的分隔符。注意分割操作通常使用 QString 的 split() 方法而不是 QStringList 的方法因为分割的结果可以直接赋值给 QStringList。
三、使用示例
#include QStringList
#include QDebugint main() {
QStringList topicList;
topicList.append(Qt);
topicList.append(C);
topicList.prepend(Programming);qDebug() Topic list: topicList;// 排序
topicList.sort();
qDebug() Sorted topic list: topicList;// 查找
int index topicList.indexOf(C);
if (index ! -1) {
qDebug() C found at index: index;
}// 连接
QString joinedList topicList.join(, );
qDebug() Joined list: joinedList;return 0;
} 在这个示例中我们创建了一个 QStringList 变量 topicList并向其中添加了一些字符串。然后我们对列表进行了排序、查找和连接操作。
QTimer-指定的时间间隔后发出信号
在C中特别是使用Qt框架时QTimer 是一个常用的类它用于在指定的时间间隔后发出信号。当你看到这样的声明
QTimer *publishTimer nullptr; 这里publishTimer 是一个指向 QTimer 对象的指针并且它被初始化为 nullptr意味着它当前不指向任何有效的 QTimer 对象。以下是对这个声明的详细讲解
一、QTimer 类
功能QTimer 类提供了定时器功能它可以在指定的时间间隔后发出 timeout() 信号。这个信号可以被连接到任何槽函数以实现定时执行某些操作的目的。继承QTimer 继承自 QObject 类因此它拥有 QObject 的所有功能和特性比如信号和槽机制、对象树管理等。精度QTimer 的精度取决于底层操作系统的定时器机制通常对于毫秒级别的定时是足够的但对于更精确的定时比如微秒级别可能需要使用其他方法。
二、指针和nullptr
指针在C中指针是一种变量类型它存储了另一个变量的内存地址。通过指针你可以直接访问和操作内存中的数据。nullptrnullptr 是C11及以后版本中引入的一个字面常量用于表示空指针。它取代了旧的 NULL 宏通常定义为 0 或 (void*)0提供了更好的类型安全性和可读性。初始化将指针初始化为 nullptr 是一种良好的编程习惯它可以防止指针在未经初始化的情况下被使用从而避免潜在的内存访问错误。
三、publishTimer 的使用 创建 QTimer 对象 在使用 publishTimer 之前你需要为它分配一个有效的 QTimer 对象。这通常通过 new 关键字来完成
publishTimer new QTimer(this); // 假设当前代码在 QObject 的子类中且 this 指向该对象 这里this 参数指定了 QTimer 对象的父对象。在Qt中将对象设置为另一个对象的子对象意味着子对象的生命周期将由父对象管理。当父对象被销毁时它的所有子对象也会被自动销毁。 连接信号和槽 创建 QTimer 对象后你通常需要连接它的 timeout() 信号到一个槽函数以便在定时器超时时执行特定的操作 connect(publishTimer, QTimer::timeout, this, YourClass::yourSlotFunction); 这里YourClass 是包含槽函数的类名yourSlotFunction 是要在定时器超时时调用的槽函数名。 启动定时器 使用 start() 方法来启动定时器并指定时间间隔以毫秒为单位 publishTimer-start(1000); // 每1000毫秒即1秒发出一次timeout信号 停止定时器 使用 stop() 方法来停止定时器 publishTimer-stop(); 清理 如果你不再需要 publishTimer并且想要释放它占用的内存你应该先停止定时器如果它正在运行然后删除指针指向的对象。但是由于 publishTimer 是父对象的子对象在父对象被销毁时publishTimer 也会被自动销毁。因此在大多数情况下你不需要手动删除它。然而如果你将 publishTimer 设置为 nullptr例如在对象被销毁之前这可以作为一种防御性编程措施以防止在对象生命周期的后期意外地使用该指针。 publishTimer-stop();
publishTimer nullptr; // 可选但推荐作为防御性编程措施
请注意在现代C中特别是使用Qt框架时通常建议使用智能指针如 QScopedPointer 或 QSharedPointer来管理动态分配的对象以避免手动管理内存和指针带来的复杂性。然而在Qt中由于对象树和父子关系的存在以及 deleteLater() 方法的提供手动管理内存的情况并不常见。
QScopedPointer /QSharedPointer-自动管理动态分配的内存从而避免内存泄漏和悬挂指针
QScopedPointer-独占所有权-局部变量
所有权QScopedPointer 提供了严格的独占所有权语义。这意味着一个 QScopedPointer 实例在其生命周期内拥有它所指向的对象并且该对象不能被其他 QScopedPointer 或裸指针raw pointer共享。生命周期QScopedPointer 的生命周期与其所在的作用域scope紧密相关。当 QScopedPointer 超出其作用域时它所指向的对象会被自动删除。用途QScopedPointer 通常用于局部变量特别是当对象的生命周期应该严格局限于某个函数或代码块时。转移所有权虽然 QScopedPointer 不支持复制但它可以通过 QScopedPointerT::take() 方法转移所有权给另一个 QScopedPointer 或裸指针并重置自身为 nullptr。
#include QScopedPointer
#include iostreamint main() {// 使用 QScopedPointer 管理一个动态分配的整数数组QScopedPointerint[] scopedArray(new int[10]);// 初始化数组for (int i 0; i 10; i) {scopedArray[i] i * i; // 例如存储平方值}// 打印数组内容for (int i 0; i 10; i) {std::cout scopedArray[i] ;}std::cout std::endl;// 不需要手动删除数组QScopedPointer 会在作用域结束时自动删除它return 0;
}
QSharedPointer-共享所有权-多个对象或线程
所有权QSharedPointer 提供了共享所有权语义。这意味着多个 QSharedPointer 实例可以共享同一个对象并且只有当最后一个 QSharedPointer 被销毁或重置时对象才会被删除。生命周期QSharedPointer 的生命周期与其自身的生命周期以及它所指向的对象的共享计数有关。只要至少有一个 QSharedPointer 指向对象对象就会保持存活。用途QSharedPointer 通常用于需要在多个对象或线程之间共享数据的场景。线程安全QSharedPointer 是线程安全的可以在多个线程之间安全地共享和传递。
注意事项
避免循环引用在使用 QSharedPointer 时要注意避免循环引用这可能会导致内存泄漏。循环引用发生在两个或多个对象相互持有对方的 QSharedPointer 时。性能考虑虽然 QSharedPointer 提供了方便的共享所有权管理但它也引入了额外的开销包括维护共享计数和可能的线程同步。因此在性能敏感的场景中要谨慎使用 QSharedPointer。裸指针的使用尽量避免使用裸指针来管理动态内存而是使用智能指针来确保内存的正确释放。如果必须使用裸指针请确保在适当的时候手动删除对象并避免悬挂指针的问题。
#include QSharedPointer
#include iostreamclass MyString {
public:MyString(const std::string str) : data(new std::string(str)) {}~MyString() {std::cout MyString destructor called, data: *data std::endl;delete data;}std::string* getData() const {return data;}
private:std::string *data;
};int main() {// 使用 QSharedPointer 管理一个动态分配的 MyString 对象QSharedPointerMyString sharedString1(new MyString(Hello, World!));{// 创建另一个 QSharedPointer它共享同一个 MyString 对象QSharedPointerMyString sharedString2 sharedString1;// 打印字符串内容std::cout *sharedString2-getData() std::endl;// 在这个作用域结束时sharedString2 会被销毁但它不会删除 MyString 对象// 因为还有 sharedString1 在共享它。}// 打印字符串内容再次证明对象仍然存在std::cout *sharedString1-getData() std::endl;// 当 sharedString1 被销毁时它是最后一个共享 MyString 对象的 QSharedPointer// 因此 MyString 对象会被删除并且其析构函数会被调用。return 0;
}
QFile-创建、读取、写入和查询文件
在C中特别是当使用Qt框架时QFile 类是一个用于文件操作的类。它提供了创建、读取、写入和查询文件的方法。当你看到这样的声明
QFile *logFile;
这里logFile 是一个指向 QFile 对象的指针。以下是对这个声明的详细讲解
一、QFile 类
功能QFile 类提供了对文件的读写访问。它继承自 QIODevice因此具有所有基本的输入输出功能。创建文件你可以使用 QFile 的构造函数来创建一个指向文件的指针但此时文件并不会被立即打开。要打开文件你需要调用 open() 方法。读写操作一旦文件被打开你可以使用 read(), readLine(), write() 等方法来读取和写入文件内容。错误处理QFile 提供了 error() 和 errorString() 方法来报告和处理文件操作中发生的错误。文件信息你可以使用 size(), exists(), isReadable(), isWritable() 等方法来查询文件的属性。
二、指针的使用 动态分配通常你会使用 new 关键字来动态分配一个 QFile 对象并将返回的指针赋值给 logFile logFile new QFile(path/to/your/logfile.txt); 这里path/to/your/logfile.txt 是你想要操作的文件的路径。 初始化在声明 logFile 时它并没有被初始化为指向任何有效的 QFile 对象。因此在使用它之前你需要确保它已经被正确地初始化和分配了内存。 生命周期管理由于 logFile 是一个指针你需要负责它的生命周期管理。这包括在适当的时候删除它以避免内存泄漏 delete logFile;
logFile nullptr; // 可选但推荐作为防御性编程措施 然而在Qt中更常见的做法是使用智能指针如 QScopedPointer 或 QSharedPointer来自动管理内存。但请注意QFile 通常不需要共享所有权因此 QScopedPointer 可能是更合适的选择。然而由于 QFile 的生命周期通常与它的使用场景紧密相关例如在打开和关闭文件期间并且 QFile 对象通常不会很大因此在实际应用中直接使用裸指针并手动管理其生命周期也是常见的做法。 使用RAII在Qt中更推荐的做法是使用RAIIResource Acquisition Is Initialization原则来管理资源。这意味着你应该在对象的构造函数中获取资源如打开文件并在析构函数中释放资源如关闭文件。这可以通过将 QFile 对象作为类的成员变量来实现而不是使用指针。这样当对象被销毁时它的析构函数会自动被调用从而释放资源。
三、示例代码
以下是一个使用 QFile 的简单示例演示了如何打开文件、写入内容、关闭文件
#include QFile
#include QTextStream
#include QDebugint main() {
QFile logFile(logfile.txt);
if (!logFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() Cannot open file for writing: logFile.errorString();
return -1;
}QTextStream out(logFile);
out This is a log message.\n;logFile.close();
return 0;
} 在这个例子中logFile 是一个 QFile 对象而不是指针它在作用域结束时会自动被销毁从而关闭文件并释放相关资源。这是Qt中管理文件和其他资源的推荐方式之一。如果你确实需要使用指针例如因为你需要将 QFile 对象传递给多个函数或类并且不想在每个地方都复制它请确保你正确地管理了指针的生命周期。
QTextStream-基于文本的输入/输出功能
在Qt框架中QTextStream 类是一个提供基于文本的输入/输出功能的类。它既可以用于读取数据如从文件或字符串中也可以用于写入数据如到文件或字符串中。当你看到这样的声明
QTextStream *logStream; 这里logStream 是一个指向 QTextStream 对象的指针。以下是对这个声明的详细讲解
一、QTextStream 类
功能QTextStream 类提供了基于文本的输入/输出操作。它支持多种编码格式并可以自动处理平台相关的换行符。构造函数QTextStream 可以与多种类型的设备关联包括 QFile、QIODevice、QString 和 QByteArray。构造函数需要传入一个指向这些设备的指针。读写操作一旦与设备关联你可以使用 QTextStream 的 和 运算符来写入和读取文本数据。格式化QTextStream 提供了多种格式化选项如设置字段宽度、精度和对齐方式。编码你可以指定 QTextStream 使用的编码格式例如 UTF-8、Latin1 等。
二、指针的使用 动态分配通常你会使用 new 关键字来动态分配一个 QTextStream 对象并将返回的指针赋值给 logStream。但是请注意QTextStream 对象通常不需要动态分配因为它们通常与特定的输入/输出设备相关联并且这些设备的生命周期通常与 QTextStream 的使用场景紧密相关。 QFile logFile(logfile.txt);
if (logFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream logStream(logFile); // 直接与 QFile 对象关联无需动态分配
logStream This is a log message.\n;
logFile.close();
} QTextStream out(logFile); 创建了一个 QTextStream 对象 out并将其与已经打开的 QFile 对象 logFile 关联起来。通过 out 对象你可以使用流操作符如 将文本数据写入到 logFile 指定的文件中。一旦 QTextStream 对象 out 与 QFile 对象 logFile 关联起来你就可以使用 out 来输出文本了。例如out This is a log message.\n; 将字符串 This is a log message.\n 写入到文件中并在末尾添加一个换行符。 在这个例子中logStream 是一个局部 QTextStream 对象它直接与 logFile 对象关联。当 logFile 对象被销毁时例如当离开作用域时它会自动关闭文件并且与 logFile 关联的 QTextStream 对象也会自动失效。 生命周期管理如果你确实需要使用指针例如因为你需要将 QTextStream 对象传递给多个函数或类并且不想在每个地方都复制它请确保你正确地管理了指针的生命周期。但是请注意由于 QTextStream 通常与特定的输入/输出设备相关联并且这些设备的生命周期通常是可以预测的因此直接使用局部对象而不是指针通常是更好的选择。 避免内存泄漏如果你选择使用指针并且动态分配了 QTextStream 对象请确保在适当的时候删除它以避免内存泄漏。然而由于 QTextStream 通常不需要动态分配因此这种情况很少发生。 使用智能指针虽然 QTextStream 通常不需要动态分配但如果你确实需要这样做并且想要自动管理内存你可以考虑使用 QScopedPointer对于独占所有权的场景或 QSharedPointer对于共享所有权的场景。但是请注意由于 QTextStream 的生命周期通常与它所关联的输入/输出设备的生命周期紧密相关因此使用智能指针可能是不必要的甚至可能导致不必要的复杂性。
三、推荐做法
在大多数情况下建议直接使用局部 QTextStream 对象并将它们与特定的输入/输出设备如 QFile、QString 等直接关联。这样做可以简化代码并减少内存管理的复杂性。如果你需要将 QTextStream 对象传递给多个函数或类并且不想在每个地方都复制它请考虑传递对输入/输出设备的引用或指针并在需要的地方创建局部的 QTextStream 对象。
QMutex
在Qt框架中QMutex 是一个互斥锁Mutex类它用于在多线程环境中保护共享数据或代码段以防止同时访问导致的竞争条件race conditions或数据损坏。当你看到这样的声明
QMutex logMutex; 这里logMutex 是一个 QMutex 对象它可以用作一个同步原语来确保只有一个线程可以访问特定的资源或代码段。以下是对这个声明的详细讲解
一、QMutex 的作用
互斥性QMutex 提供了互斥性确保同一时间只有一个线程可以持有锁。保护共享资源在多线程应用中多个线程可能会尝试同时访问和修改共享资源如全局变量、数据结构或文件。QMutex 可以用来保护这些资源防止数据竞争和不一致性。代码同步除了保护数据外QMutex 还可以用于同步代码的执行顺序确保特定的操作按预期的顺序执行。
二、QMutex 的使用 锁定和解锁要使用 QMutex你需要在访问共享资源之前调用 lock() 方法来获取锁。在访问完成后你应该调用 unlock() 方法来释放锁。重要的是要确保在每条执行路径上都能释放锁以避免死锁deadlock的发生。 QMutex logMutex;// 在线程函数或某个方法中
logMutex.lock();
// 访问和修改共享资源
// ...
logMutex.unlock(); RAII 风格的锁管理为了避免忘记解锁或由于异常导致的解锁失败Qt 提供了 QMutexLocker 类。这是一个基于 RAIIResource Acquisition Is Initialization原则的锁管理器它在构造时自动获取锁并在析构时自动释放锁。 QMutex logMutex;// 在线程函数或某个方法中
{
QMutexLocker locker(logMutex);
// 访问和修改共享资源
// ...
// 当 locker 对象离开作用域时它会自动调用 unlock()
} 尝试锁定QMutex 还提供了 tryLock() 方法它尝试获取锁但不阻塞。如果锁可用tryLock() 将返回 true 并获取锁如果锁不可用它将立即返回 false 而不等待。
三、注意事项
避免死锁确保在每条执行路径上都能释放锁特别是在使用异常处理时。性能考虑频繁地锁定和解锁可能会影响性能特别是在高并发环境中。因此应该尽量减小锁的作用范围并考虑使用其他同步机制如读写锁、信号量来优化性能。递归锁QMutex 默认不支持递归锁定即同一个线程不能多次获取同一个锁。如果需要递归锁定请使用 QRecursiveMutex。
四、应用场景
日志记录如变量名 logMutex 所暗示的互斥锁常用于保护日志记录操作确保多个线程不会同时写入日志文件从而导致日志混乱。线程间通信在多线程应用中QMutex 可以与其他同步机制如条件变量、信号槽结合使用以实现线程间的协调和通信。保护共享数据结构当多个线程需要访问和修改同一个数据结构时如链表、树、哈希表等QMutex 可以用来确保数据的一致性和完整性。 MQTT
在Qt框架中QMqttClient 类是用于与MQTT协议服务器进行通信的一个客户端类。MQTTMessage Queuing Telemetry Transport是一个轻量级的、基于发布/订阅模式的消息传输协议广泛应用于物联网IoT场景中以实现设备之间的可靠通信。当你看到这样的声明
QMqttClient m_client;
这里m_client 是一个 QMqttClient 对象它表示一个MQTT客户端实例。以下是对这个声明的详细讲解
一、QMqttClient 的作用
连接服务器QMqttClient 允许你连接到MQTT协议的消息代理broker服务器。发布消息一旦连接成功你可以使用 QMqttClient 来发布publish消息到特定的主题topic。订阅主题你还可以订阅subscribe一个或多个主题以便接收这些主题上的消息。处理消息当订阅的主题上有新消息发布时QMqttClient 会通过信号和槽机制将消息传递给应用程序进行处理。
二、QMqttClient 的使用 设置服务器地址和端口在使用 QMqttClient 之前你需要设置MQTT服务器的地址和端口。这通常通过调用 setHostname() 和 setPort() 方法来完成。 设置客户端ID每个MQTT客户端都需要一个唯一的客户端ID来标识自己。你可以通过调用 setClientId() 方法来设置它。 建立连接使用 connectToHost() 方法尝试连接到MQTT服务器。连接成功后QMqttClient 会发出 connected 信号。 发布消息使用 publish() 方法发布消息到指定的主题。你可以指定消息的质量服务等级QoS和是否保留消息。 订阅主题使用 subscribe() 方法订阅一个或多个主题。当这些主题上有新消息时QMqttClient 会发出 messageReceived() 信号。 处理断开连接如果连接断开QMqttClient 会发出 disconnected 信号。你可以通过重新连接来处理这种情况。
三、信号和槽
QMqttClient 提供了多个信号来通知应用程序关于连接状态、消息接收等事件。你可以使用Qt的信号和槽机制来连接这些信号到你的槽函数中以便处理这些事件。
四、注意事项
线程安全QMqttClient 不是线程安全的。你应该确保在一个线程中创建和使用 QMqttClient 对象并避免在多个线程之间共享它。错误处理在处理MQTT连接和消息时你应该添加适当的错误处理代码来处理可能的失败情况如连接失败、发布消息失败等。资源释放在不再需要 QMqttClient 对象时你应该确保正确释放它所占用的资源。这通常意味着调用 disconnectFromHost() 方法来断开与MQTT服务器的连接并删除 QMqttClient 对象。
#include QApplication
#include QWidget
#include QVBoxLayout
#include QPushButton
#include QTextEdit
#include QMqttClient
#include QDebugclass MqttWidget : public QWidget {Q_OBJECTpublic:MqttWidget(QWidget *parent nullptr) : QWidget(parent), mqttClient(new QMqttClient(this)) {QVBoxLayout *layout new QVBoxLayout(this);connectButton new QPushButton(Connect to MQTT, this);publishButton new QPushButton(Publish Message, this);subscribeButton new QPushButton(Subscribe to Topic, this);textEdit new QTextEdit(this);textEdit-setReadOnly(true);layout-addWidget(connectButton);layout-addWidget(publishButton);layout-addWidget(subscribeButton);layout-addWidget(textEdit);// 设置MQTT服务器地址和端口mqttClient-setHostname(mqtt.example.com); // 替换为你的MQTT服务器地址mqttClient-setPort(1883); // 替换为你的MQTT服务器端口// 设置客户端IDmqttClient-setClientId(myUniqueId); // 替换为一个唯一的客户端ID// 连接信号和槽connect(mqttClient, QMqttClient::connected, this, MqttWidget::onConnected);connect(mqttClient, QOverloadQAbstractSocket::SocketError::of(QMqttClient::disconnected),this, MqttWidget::onDisconnected);connect(mqttClient, QMqttClient::messageReceived, this, MqttWidget::onMessageReceived);connect(connectButton, QPushButton::clicked, this, MqttWidget::onConnectClicked);connect(publishButton, QPushButton::clicked, this, MqttWidget::onPublishClicked);connect(subscribeButton, QPushButton::clicked, this, MqttWidget::onSubscribeClicked);}private slots:void onConnectClicked() {mqttClient-connectToHost();}void onDisconnected(QAbstractSocket::SocketError error) {qDebug() Disconnected from MQTT server with error: error;textEdit-append(Disconnected from MQTT server.);}void onConnected() {qDebug() Connected to MQTT server.;textEdit-append(Connected to MQTT server.);}void onMessageReceived(const QByteArray message, const QMqttTopicName topic) {qDebug() Received message on topic: topic.name() Message: message;textEdit-append(QString(Received message on topic: %1\nMessage: %2).arg(topic.name()).arg(message));}void onPublishClicked() {// 这里应该添加发布消息的代码例如// QByteArray payload Hello MQTT;// mqttClient-publish(my/topic, payload, QMqttQualityOfService::AtMostOnce);// 但为了简化示例这里暂时不发布消息。qDebug() Publish button clicked, but no message is published in this example.;}void onSubscribeClicked() {mqttClient-subscribe(my/topic);textEdit-append(Subscribed to topic my/topic.);}private:QMqttClient *mqttClient;
先到这里吧请多指教 文章转载自: http://www.morning.mhnrx.cn.gov.cn.mhnrx.cn http://www.morning.tzlfc.cn.gov.cn.tzlfc.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.dnls.cn.gov.cn.dnls.cn http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn http://www.morning.gqddl.cn.gov.cn.gqddl.cn http://www.morning.jxlnr.cn.gov.cn.jxlnr.cn http://www.morning.tyklz.cn.gov.cn.tyklz.cn http://www.morning.gskzy.cn.gov.cn.gskzy.cn http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.jpnfm.cn.gov.cn.jpnfm.cn http://www.morning.skrcn.cn.gov.cn.skrcn.cn http://www.morning.rwjh.cn.gov.cn.rwjh.cn http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn http://www.morning.ytbr.cn.gov.cn.ytbr.cn http://www.morning.sjbty.cn.gov.cn.sjbty.cn http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.wqwbj.cn.gov.cn.wqwbj.cn http://www.morning.mdmxf.cn.gov.cn.mdmxf.cn http://www.morning.hypng.cn.gov.cn.hypng.cn http://www.morning.xdpjs.cn.gov.cn.xdpjs.cn http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn http://www.morning.dsncg.cn.gov.cn.dsncg.cn http://www.morning.qqklk.cn.gov.cn.qqklk.cn http://www.morning.pszw.cn.gov.cn.pszw.cn http://www.morning.qfkxj.cn.gov.cn.qfkxj.cn http://www.morning.ktfnj.cn.gov.cn.ktfnj.cn http://www.morning.xbwqg.cn.gov.cn.xbwqg.cn http://www.morning.zgdnz.cn.gov.cn.zgdnz.cn http://www.morning.bmtyn.cn.gov.cn.bmtyn.cn http://www.morning.lgcqj.cn.gov.cn.lgcqj.cn http://www.morning.mmhyx.cn.gov.cn.mmhyx.cn http://www.morning.rui931.cn.gov.cn.rui931.cn http://www.morning.xxrgt.cn.gov.cn.xxrgt.cn http://www.morning.tralution.cn.gov.cn.tralution.cn http://www.morning.qwbht.cn.gov.cn.qwbht.cn http://www.morning.glkhx.cn.gov.cn.glkhx.cn http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.qsy38.cn.gov.cn.qsy38.cn http://www.morning.ypjjh.cn.gov.cn.ypjjh.cn http://www.morning.tsxg.cn.gov.cn.tsxg.cn http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn http://www.morning.rqknq.cn.gov.cn.rqknq.cn http://www.morning.srgbr.cn.gov.cn.srgbr.cn http://www.morning.zlqyj.cn.gov.cn.zlqyj.cn http://www.morning.hypng.cn.gov.cn.hypng.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.kgtyj.cn.gov.cn.kgtyj.cn http://www.morning.srjgz.cn.gov.cn.srjgz.cn http://www.morning.qqbw.cn.gov.cn.qqbw.cn http://www.morning.kltsn.cn.gov.cn.kltsn.cn http://www.morning.fbmjw.cn.gov.cn.fbmjw.cn http://www.morning.nsjpz.cn.gov.cn.nsjpz.cn http://www.morning.czcbl.cn.gov.cn.czcbl.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.mzmqg.cn.gov.cn.mzmqg.cn http://www.morning.dtgjt.cn.gov.cn.dtgjt.cn http://www.morning.yrngx.cn.gov.cn.yrngx.cn http://www.morning.nwfxp.cn.gov.cn.nwfxp.cn http://www.morning.xlmpj.cn.gov.cn.xlmpj.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.nzfjm.cn.gov.cn.nzfjm.cn http://www.morning.thlr.cn.gov.cn.thlr.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.mbfkt.cn.gov.cn.mbfkt.cn http://www.morning.rbrhj.cn.gov.cn.rbrhj.cn http://www.morning.zhnyj.cn.gov.cn.zhnyj.cn http://www.morning.sryyt.cn.gov.cn.sryyt.cn http://www.morning.yqlrq.cn.gov.cn.yqlrq.cn http://www.morning.jgmlb.cn.gov.cn.jgmlb.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.mdjzydr.com.gov.cn.mdjzydr.com http://www.morning.mhcft.cn.gov.cn.mhcft.cn http://www.morning.bpknt.cn.gov.cn.bpknt.cn http://www.morning.mnslh.cn.gov.cn.mnslh.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn