• 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控件资源不能正确回收;

  • 相关阅读:
    java-判断某一年是否是闰年
    java-不用其他变量实现两变量互换
    java基础一标识符,运算符
    robotium学习(三)
    robotium学习(二)
    robotium学习(一)
    AX2012 订单折扣的应用
    AX2012 用户收藏夹复制
    ueditor 改变图片上传路径
    if else 多路分支,多条件运算
  • 原文地址:https://www.cnblogs.com/lizhenneng/p/10212672.html
Copyright © 2020-2023  润新知