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编程跨平台编译
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- class QProcess;
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = 0);
- ~MainWindow();
- private slots:
- void openProcess();
- void readResult(int exitCode);
- private:
- QProcess *p;
- };
- #endif // MAINWINDOW_H
mainwindow.cpp
- #include <QProcess>
- #include <QPushButton>
- #include <QMessageBox>
- #include <QTextCodec>
- #include "mainwindow.h"
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- p = new QProcess(this);
- QPushButton *bt = new QPushButton("display", this);
- connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));
- }
- MainWindow::~MainWindow()
- {
- }
- void MainWindow::openProcess()
- {
- #if defined(Q_OS_WIN32)
- p->start("cmd.exe", QStringList() << "/c" << "dir");
- #elif defined(Q_OS_LINUX)
- p->start("ls", QStringList() << "/home/usr_name");
- #endif
- connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
- }
- void MainWindow::readResult(int exitCode)
- {
- if(exitCode == 0) {
- #if defined(Q_OS_WIN32)
- QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
- QString result = gbkCodec->toUnicode(p->readAll());
- #elif defined(Q_OS_LINUX)
- QTextCodec* utfCodec = QTextCodec::codecForName("UTF-8");
- QString result = utfCodec->toUnicode(p->readAll());
- #endif
- QMessageBox::information(this, "dir", result);
- }
- }
- QT跨平台windows编程
- 基于qt的c++跨平台windows编程技术
- 跨平台编程和QT
- 跨平台编程和QT
- Qt 编程学习之hello world 篇 [windows] 【window 平台】
- c++跨平台Windows编程
- Qt跨平台与跨windows版本
- 使用QT做跨平台编程
- Windows平台多线程编程
- Windows平台网络编程
- Qt实现软件从Windows到Linux跨平台
- 为什么选择QT进行跨平台图形编程
- 跨平台编程的利器—Qt:概述
- 跨平台GUI--Qt windows 开发环境安装配置(VS2005+QT+IntegrationPlugin)(转载)
- 跨平台GUI--Qt windows 开发环境安装配置(VS2005+QT+IntegrationPlugin)
- 跨平台GUI--Qt windows 开发环境安装配置(VS2005+QT+IntegrationPlugin)
- windows 平台下安装使用QT
- windows 平台下安装使用QT
- NGUI UI Localize本地化(语言切换)
- [JAVA学习笔记-82]Thread states in JAVA
- python爬取5442网站图片
- 1154 能量项链
- Volley源码学习笔记_CacheDispatcher和NetworkDispatcher
- QT跨平台windows编程
- Spring-beans架构设计原理
- jade的启动与运行
- 棋盘中的马
- leetcode-第十六周
- 用一维数组存储学号和成绩,然后,按成绩排序输出
- ping成功情况下无法访问到网页
- Oracle 11g Windows新建用户、表空间、授权
- 动态导出excel中的列和行