跳至主要內容

Qt

LincZero大约 2 分钟

Qt

目录

知识点

Qt窗口坐标系

  • 左上角是原点 (0,0),水平往右为x正方向,垂直往下为y正方向
  • 对于嵌套窗口,其坐标是相对于父窗口来说的

Qt宏

Qt常用宏

  • Q_OBJECT,Qt元对象系统

  • QT_BEGIN_NAMESPACE,命名空间

    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
  • QT_FORWARD_DECLARE_CLASS,相当于class 类名,和头文件#include作用类似

    QT_FORWARD_DECLARE_CLASS(QAction)
    QT_FORWARD_DECLARE_CLASS(QActionGroup)
    QT_FORWARD_DECLARE_CLASS(QMenu)
    QT_FORWARD_DECLARE_CLASS(QSpinBox)
    

Q_OBJECT宏 & Qt元对象系统

Q_OBJECT宏

  • 作用:是启动Qt5元对象系统的一些特性(如支持信号和槽等)

Qt元对象系统

  • 作用
    • 对象间的通信机制(信号和槽)
    • 运行时类型信息
    • 动态属性系统的支持
  • 简概
    • 是标准C++的一个扩展,使Qt能更好地实现GUI图形用户界面编程
    • 不支持C++模板,尽管该模板扩展了标准C++的功能
  • 基于
    • 基类QObject:任何需要元对象系统功能的类,必须继承自QObejct
    • Q_OBJECT宏:必须出现在类的私有声明区,用于启动元对象的特性
    • 元对象编译器(Mete-Object Compiler,moc):为QObject子类实现元对象特性提供代码实现

一些比较奇怪的用法

#ifndef QT_NO_CONTEXTMENU
    void contextMenuEvent(QContextMenuEvent *event) override;
#endif // QT_NO_CONTEXTMENU
#ifdef Q_OS_MAC
    "<p>On OS X, the \"Black\" dock widget has been created as a "
    "<em>Drawer</em>, which is a special kind of QDockWidget.</p>"
#endif
#ifdef Q_OS_MACOS
    setUnifiedTitleAndToolBarOnMac(true);
#endif

Qt常用算法

  • aAbs(),返回绝对值
  • qMax(,),返回最大值
  • qRound(),返回圆整值
  • qSwap(,),交换两数

QT的foreach、C++11的范围for、容器循环

Qt提供的替代C++中for循环的关键字

foreach(int, QList<int>)
{
    // process
}

不过话说C++11本来就有基于范围for循环,可用于数组和容器赖

for (double x : prices) cout << x << std::endl;	// 只能输出
for (double &x : prices) x = x*0.8;				// 可以改变数组的内容

Qt构建、运行、qmake的区别

  • 区别
    • qmake:根据实际环境创建项目文件.pro 并且运行qmake生成适当的Makefile
    • 构建:构建是增量编译,只编译有变化部分
    • 重新构建:是把所有部分都重新编译
    • 运行:有改动则根据已有的Makefile进行编译,执行;构建和重新构建时如果没有Makefile,会根据.pro文件等生成Makefile后再编译
  • 总结
    • 所以运行顺序应该是:qmake - 构建 - 运行