QT跨平台windows编程

来源:互联网 发布:php简历管理系统 编辑:程序博客网 时间:2024/04/27 15:14

Qt 编程关键技术

1 信号与槽

信号和槽机制是QT的核心机制,是一种高级接口,应用于对象之间的通信。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的Qt工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

所有从QObject或其子类(例如QWidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。对象甚至并不了解具体的通信机制。

信号与槽连接是任意个的,甚至信号与信号也可以连接的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

2 Qt事件处理

Qt可以说是是以事件驱动的UI工具集,信号与槽在多线程的实现也依赖于Qt的事件处理机制。在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent。Qt中事件的产生、分发、接受和处理:

(1)事件的产生如按键,点击鼠标等等动作所产生的keyPressEvent,  keyReleaseEvent,mousePressEvent,mouseReleaseEvent等事件(分别被封装成QMouseEvent和QKeyEvent中),这些事件来自于底层的操作系统,它们以异步的形式通知Qt事件处理系统。

(2)事件的接受和处理使用QObject。事件处理机制是QObject三大职责(内存管理、内省与事件处理制)之一。任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。

(3)事件的分发:对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver。对于Qt GUI程序,由QApplication来负责。

接下来用一个例子展现windows编程跨平台编译

  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.  
  4. #include <QMainWindow>  
  5.  
  6. class QProcess;  
  7.  
  8. class MainWindow : public QMainWindow  
  9. {  
  10.     Q_OBJECT  
  11.  
  12. public:  
  13.     MainWindow(QWidget *parent = 0);  
  14.     ~MainWindow();  
  15.  
  16. private slots:  
  17.     void openProcess();  
  18.     void readResult(int exitCode);  
  19.  
  20. private:  
  21.     QProcess *p;  
  22. };  
  23.  
  24. #endif // MAINWINDOW_H 

mainwindow.cpp

  1. #include <QProcess>  
  2. #include <QPushButton>  
  3. #include <QMessageBox>  
  4. #include <QTextCodec>  
  5.  
  6. #include "mainwindow.h"  
  7.  
  8. MainWindow::MainWindow(QWidget *parent)  
  9.     : QMainWindow(parent)  
  10. {  
  11.     p = new QProcess(this);  
  12.     QPushButton *bt = new QPushButton("display"this);  
  13.     connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));  
  14. }  
  15.  
  16. MainWindow::~MainWindow()  
  17. {  
  18.  
  19. }  
  20.  
  21. void MainWindow::openProcess()  
  22. {  
  23. #if defined(Q_OS_WIN32)  
  24.     p->start("cmd.exe", QStringList() << "/c" << "dir");  
  25. #elif defined(Q_OS_LINUX)  
  26.     p->start("ls", QStringList() << "/home/usr_name");  
  27. #endif  
  28.     connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));  
  29. }  
  30.  
  31. void MainWindow::readResult(int exitCode)  
  32. {  
  33.     if(exitCode == 0) {  
  34. #if defined(Q_OS_WIN32)  
  35.         QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
  36.         QString result = gbkCodec->toUnicode(p->readAll());  
  37. #elif defined(Q_OS_LINUX)  
  38.         QTextCodec* utfCodec = QTextCodec::codecForName("UTF-8");  
  39.         QString result = utfCodec->toUnicode(p->readAll());  
  40. #endif  
  41.         QMessageBox::information(this"dir", result);  
  42.     }  
  43. }  

原创粉丝点击