MFC到Linux+QT的移植

  1. MFC下的sleep()函数是以微秒为单位的,Linux下的speep()以秒为单位,usleep以微妙为单位;
  2. MFC下的ShowWindow()用于显示窗口,QT中显示窗口通过show()函数;
  3. MFC下的控件可以绑定一个变量(例如输入控件),当绑定的变量修改值后,通过ShowWindow()可以更新到界面上,而QT上不需要绑定变量,直接通过控件的成员函数设置值后数据会自动更新到界面上;
  4. MFC中通过注册回调函数将事件和函数绑定,当事件发生时会触发注册的回调函数,QT中通过信号/槽的方式实现类似功能;
  5. 如果你要在C中通过QT弹出对话框,首先需要新建一个QApplication app,然后新建一个对话框对象并调用show(),最后还需要执行app.exec()让对话框进入QT的事件循环,此时对话框才能接收到QT事件以显示对话框;
  6. 如果你要在C中在系统托盘区域旁弹出一个提示窗口,可能有些复杂,首先你需要新建一个QApplication app,然后新建一个QSystemTray tray并调用tray.show(),调用QTimer::singleShot()函数指定10ms(tray.show()后需要一段时间tray才能初始化完成,否则后面的调用可能无法正常显示)后调用tray.showMessage()
  7. QT中获取网卡硬件地址和IP地址的方法可使用如下代码:
    foreach (QNetworkInterface interface, QNetworkInterface::allInterfaces()) {

        qDebug() << interface.hardwareAddress() << ", flags:" << interface.flags();

        foreach (QNetworkAddressEntry entry, interface.addressEntries()) {

                qDebug() << entry.ip();

            }

        }

    Flags中包含一些标志信息,包括是不是回环网络,网卡是否启动等;

  8. IE的插件为ocx插件,在linux下要实现firefox的插件可通过NPAPIQT/C++交互,目前在firefox 52 上可支持,新版本不一定能支持,例子请点击链接https://github.com/qtproject/qt-solutions/tree/master/qtbrowserplugin,将编译出来的库拷贝到/usr/lib/mozilla/plugins/目录下,访问自带的实例网页即可;

  9. Linux下保证进程唯一性的方式可通过如下方式实现:

    a) 应用启动时判断/var/run下是否存在appname.pid文件,如果存在则继续步骤b,若不存在则创建.pid文件;

    b) 读取文件中的进程号,获取进程号后判断此进程是否存在,若存在,退出程序;

    c) 若进程不存在,获取本进程号并写入.pid文件,程序继续执行;

  10. MFC中调用AfxMessage()messagebox()弹出提示对话框,QT中使用QMessageBox()弹出提示对话框,可自定义函数messagebox(),函数中通过QMessageBox()弹出对话框;

  11. 以下为MFCQT中常用控件的对应关系:

MFC

QT

单行显示标签

QLabel

单行文本输入框

CEdit

QLineEdit

按钮

Button

QPushButton

组合框

CComboBox

QComboBox

对话框

CDialogEx

QDialog

系统托盘

NOTIFYICONDATA

QSystemTray

字符串

CString

QString/string

指针

HANDLE

void *

定时器

CTime

QTimer

  12. MFC中提供了CIPAddressCtrl控件用于输入并显示IP地址,QT中没有提供此类插件,如有需要,可从如下网址下载:

    https://github.com/lizhenneng/IPv4Edit.git

    可支持QT4/QT5,编译后放入/usr/lib/x86_64-linux-gnu/qt5/plugins/designer/,通过 qtcreator 打开设计器,即可在左侧控件栏看到IPv4Edit控件,如果是在QT4中使用此 控     件,则 qtcreator也需要基于QT4运行,否则在qtcreator的设计器左侧控件栏中 不显示此控件, 但程序运行的时候会显示,若一定需要在设计器中显示此控件,可以 现将基于    QT4编译 的控件拷贝到/usr/lib/x86_64-linux-gnu/qt4/plugins/designer/,然 后运行基于QT4d esigner打开界面文件即可显示此控件

  13. 如果要获取当前程序的工作路径,在QT中可调用QDir::currentPath()获取;

  14. 在数据加解密及传输过程中,一般使用base64格式传输数据,QT中提供的QByteArray::fromBase64()QByteArray::toBase64()可方便进行普通格式和base64格式之间的转换;

  15. 对于设备的热插拔(ukey),可通过netlink socket方式监听内核的插拔事件;

  16. 通过进程名获取进程号可直接遍历/proc文件系统;

  17. Firefox可使用~/.mozilla/firefox/profiles.ini及对应Path路径下的prefs.js来配置,如果需要一个更高优先级的配置文件,可在Path指定路径下创建user.js并添加配置参数以覆盖prefs.js中的配置;

  18. QT资源的回收,可在退出应用时使用qApp::quit()QT控件对象会按照自己的方式回收界面资源,请不要使用系统函数exit(),使用此方式会导致QT控件资源不能正确回收;

猜你喜欢

转载自www.cnblogs.com/lizhenneng/p/10212672.html