昨天和学长一起讨论一个旧的项目,他看到我的project里大量使用了Qt的库,说Qt不是做GUI的吗,在编一些非GUI的东西你用它们干嘛(看来这是很多人的既定观点,真的需要改变一下),我说Qt不仅只是可以做GUI还可以完成很多东西,并且很强大,绝对不会比你常用的库弱。整个项目使用Qt的库还可以在一定程度上统一编程风格,并提高代码质量和减少维护开销,Qt库也提供很好的线上资源,很方便查阅。我这里举三个很简单的例子,说明Qt库的一些其他特性。
信号和槽
正如CObject是大多数MFC类的根类或基类,QObject是Qt的基类。先在我们的类继承QObject,并在类声明中使用的Q_OBJECT宏,我们就可以使用QObject信号和槽的强大的机制。
QObject信号和槽即简单又好用,现在举一个简单的例子,在例子中使用QTime和QObject信号和槽,每100微妙对象间自动进行一次接口的数据交换。
#include <QObject>
#include <QTime>
class MyClass : public QObject {
Q_OBJECT
public:
MyClass();
int data_in;
int data_out;
private slots:
void dataExchangePipe();
private:
AnotherClass anotherclass;
QTimer *poller;
};
/* myclass.cpp */
MyClass::MyClass() {
object = new AnotherClass;
poller = new QTimer(this);
connect(poller, SIGNAL(timeout()), this, SLOT(dataExchangePipe()));
poller->start(100); // the time to poller
}
void MyClass::dataExchangePipe() {
data_in = object->data_out;
object->data_in = data_out;
}
容器,迭代器
还在使用STL容器吗,也许Qt也是一个很好的选择,Qt提供了QVector<T>, QLinkedList<T>,QList<T>QMap<K,T> and QHash<K,T>容器。Qt提供对容器的两种风格的迭代:Java风格的迭代器和STL风格迭代器
Java风格(非常简单,Qt官网上的一个例子)
list << "A" << "B" << "C" << "D";
QListIterator<QString> i(list);
while (i.hasNext())
qDebug() << i.next();
STL风格(比较powerful,每一个sequential container class C<T>都有两个 STL-style 迭代器类型: C<T>::iterator 和 C<T>::const_iterator,以下是Qt官网上的例子)
list << "A" << "B" << "C" << "D";
QList<QString>::iterator i = list.end();
while (i != list.begin()) {
--i;
*i = (*i).toLower();
}
多线程
Qt的QThread很类似C++Boost线程库。使用起来也非常容易,例如:
建thread:
class MyThread : public QThread {
public: void run();
};
void MyThread::run() {
...
...
}
使用thread,很简单:
先声明对象,MyThread *mythread = new MyThread;
启动: mythread->start();
终止: mythread->terminate();
对线程的同步,Qt也提供了QMutex;我们可以声明QMutex mutex;然后使用mutex.lock();和mutex.unlock();进行线程同步。
更多有用的特性请查阅:http://doc.trolltech.com/4.5/index.html
没有评论:
发表评论