Qt 信号和槽

信号函数没有返回值,且只是一个函数声明,必须有 signals: 声明 槽函数的函数标签必须和信号函数相同(相同的返回值类型和形参列表) Qt5 后成员函数也可作为 slots,可以不用 slots: 声明 slots: 声明前要添加访问权限修饰符 信号函数和槽函数其实都可以被重载 // signal 和 slots 都可以重载 // Qt5的方式 void(subWindow::*pFun1)() = &subWindow::showMainWindow; void(MainWindow::*pSlot1)() = &MainWindow::onShowMainWindow; connect(&sw, pFun1, this, pSlot1); void(subWindow::*pFun2)(int,QString) = &subWindow::showMainWindow; void(MainWindow::*pSlot2)(int,QString) = &MainWindow::onShowMainWindow; connect(&sw, pFun2, this, pSlot2); // Qt4的方式 // 1. SIGNAL、SLOT宏会把信号和槽转成字符串,所以就不能进行编译期错误检查 // 2. 槽函数前面必须有 slots 标签,否则无法识别为槽函数 connect(&sw, SIGNAL(showMainWindow()), this, SLOT(onShowMainWindow())); connect(&sw, SIGNAL(showMainWindow(int,QString)) , this, SLOT(onShowMainWindow(int,QString))); // Lambda 表达式 void(subWindow::*pFun1)() = &subWindow::showMainWindow; connect(&sw, pFun1, [](){ qDebug()<<"没有参数的信号"; } ); void(subWindow::*pFun2)(int,QString) = &subWindow::showMainWindow; connect(&sw, pFun2, [](int a, QString msg){ qDebug()<<a<<msg; } ); // Lambda 表达式使用注意事项 // 如果b3是局部变量或者成员变量,lambda不要使用引用传值 QPushButton *b3 = new QPushButton(this); b3->setText("Lambda"); int a = 10, b = 100; connect(&b2/*b3*/, &QPushButton::clicked, [=](){ // 此处使用 & 传值会有问题 qDebug()<<a<<b; } );

June 14, 2022 · 1 min · Rick Cui

C++11 关于右值引用、左值引用和通用引用的思考

一、通用引用 类型声明形式为 type&& 其中 type 类型是要进行推导的,如果类型推导没有发生,那么 type&& 代表一个右值引用 如果一个对象被声明为 auto&&,这个形参或者对象就是一个通用引用 通用引用,如果它被右值初始化,就会对应地成为右值引用;如果它被左值初始化,就会成为左值引用 如果在一个类模板里面看见了一个函数形参类型为 T&&,也不一定就是通用引用,可能并没有发生类型推导 void f(Widget&& param); //右值引用 Widget&& var1 = Widget(); //右值引用 auto&& var2 = var1; //通用引用(不是右值引用) template<typename T> void f(std::vector<T>&& param); //右值引用 template<typename T> void f(T&& param); //通用引用(不是右值引用) template <typename T> void f(const T&& param); //param是一个右值引用,因为添加了 const 限定符 // 函数模板 一般可能是通用引用 template <typename T> void print_reference_type(T &&i) { // T&& 或是 auto&& if (std::is_lvalue_reference<decltype(i)>::value) { std::cout << "lvalue: " << i << std::endl; } else if (std::is_rvalue_reference<decltype(i)>::value) { std::cout << "rvalue: " << i << std::endl; } else { std::cout << "unknown value: " << i << std::endl; } } // 因为 push_back 在有一个特定的 vector 实例之前不可能存在, // 而实例化 vector 时的类型已经决定了 push_back 的声明 // 所以在这里并没有发生类型推导 template<class T, class Allocator = allocator<T>> //来自C++标准 class vector { public: void push_back(T&& x); … } 一个记录任意函数调用的时间开销的函数模板...

June 11, 2022 · 2 min · Rick Cui

C 实现继承和多态

C中的继承和多态

May 24, 2022 · 1 min · Rick Cui

使用 VS2022 部署、运行和调试 Linux MSBuild 项目

一、设置 Linux 环境 1. 确保已安装用于 Visual Studio 的 Linux 开发工作负荷 2. Linux 所需环境 sudo apt-get install openssh-server g++ gdb make ninja-build rsync zip 确保 ssh 服务在 Linux 计算机上运行 sudo service ssh start 参考官方文档 二、连接到远程 Linux 打开【工具】>【选项】>【跨平台】>【连接管理器】进行添加设置 也可以连接到 WSL,参考官方文档 三、创建 Linux MSBuild 项目 四、配置 Linux MSBuild 项目 大部分的默认配置都不需要修改,只需关注几个地方 调试设置 包含目录是 Linux 上项目的路径 库目录可使用相对路径 如果依赖的是动态库,需要在 Linux 端设置 LD_LIBRARY_PATH 最后在 Linux 环境中生成的项目目录如下 还可以在【调试】中打开【Linux控制台】 参考官方文档

May 18, 2022 · 1 min · Rick Cui

C++11 继承构造

通过 using 可以方便的使用父类的构造函数和其他函数; 优先使用子类的构造和函数,如果没有找到匹配的才会调用基类的; 可在子类的初始化列表中调用父类的构造函数,并对子类的成员进行列表初始化; class BS { int q; double w; public: BS() : q(0), w(0) {} BS(int k) : q(k), w(100) {} BS(double x) : q(-1), w(x) {} BS(int k, double x) : q(k), w(x) {} void Show() const { std::cout << q <<", " << w << '\n'; } int fn(int j) { cout << "BS::fn(int)\n"; return 0; } double fn(double w) { cout << "BS::fn(double)\n"; return 0; } void fn(const char * s) { cout << "BS::fn(const char *)\n"; } }; class DR : public BS { short j; public: using BS::BS; DR() : j(-100) {} // DR needs its own default constructor DR(double x) : BS(2*x), j(int(x)) {} DR(int i) : j(-2), BS(i, 0....

May 13, 2022 · 2 min · Rick Cui