2009年11月22日星期日

除了编GUI,Qt还可以做很多事

昨天和学长一起讨论一个旧的项目,他看到我的project里大量使用了Qt的库,说Qt不是做GUI的吗,在编一些非GUI的东西你用它们干嘛(看来这是很多人的既定观点,真的需要改变一下),我说Qt不仅只是可以做GUI还可以完成很多东西,并且很强大,绝对不会比你常用的库弱。整个项目使用Qt的库还可以在一定程度上统一编程风格,并提高代码质量和减少维护开销,Qt库也提供很好的线上资源,很方便查阅。我这里举三个很简单的例子,说明Qt库的一些其他特性。

信号和槽

正如CObject是大多数MFC类的根类或基类,QObject是Qt的基类。先在我们的类继承QObject,并在类声明中使用的Q_OBJECT宏,我们就可以使用QObject信号和槽的强大的机制。
QObject信号和槽即简单又好用,现在举一个简单的例子,在例子中使用QTime和QObject信号和槽,每100微妙对象间自动进行一次接口的数据交换。

/* myclass.h */
#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官网上的一个例子)

QList<QString> list; 
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官网上的例子)

QList<QString> list;  
list << "A" << "B" << "C" << "D";  
QList<QString>::iterator i = list.end(); 
while (i != list.begin()) { 
    --i;
    *i = (*i).toLower(); 
}

多线程

Qt的QThread很类似C++Boost线程库。使用起来也非常容易,例如:

建thread:

#include <QThread> 
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

没有评论: