【Qt6】QWidgetAction 的使用

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

在开始主题前,先看一个 C++ 例子:
  1. #include <iostream>
  2. struct Data
  3. {
  4.     int a;
  5.     int b;
  6. };
  7. // 注意这里
  8. struct Data *s;
  9. void doSome()
  10. {
  11.     Data k;
  12.     k.a = 100;
  13.     k.b = 300;
  14.     // 注意这里,会出大事
  15.     s = &k;
  16. }
  17. int main()
  18. {
  19.     // 先调用了函数
  20.     doSome();
  21.     // 再输出 Data 结构体的内容
  22.     std::cout << "a = " << s->a << '\n';
  23.     std::cout << "b = " << s->b << '\n';
  24.     return 0;
  25. }
复制代码
应用程序窗口继承了 QMainWindow 类,因为这个类比较方便构建菜单栏、工具栏、状态栏、停靠栏。咱们用它来创建一个菜单栏对象(QMenuBar),然后添加一个叫“应用程序”的菜单(QMenu)。
“应用程序”菜单的前两个菜单项是普通的 action,第三个是 QWidgetAction 对象。在 new 出 QWidgetAction 后,先初始化一下 QSpinBox 组件,然后调用 setDefaultWidget 方法,这样 QSpinBox 组件就能显示在菜单项上了。
在 main 函数中显示主窗口。
  1. a = -858993460
  2. b = -858993460
复制代码
好了,见证奇迹的时候到了,看看效果。

 
另一种用法,就是从 QWidgetAction 类派生。然后重写这个方法:
  1. void doSome()
  2. {
  3.     static Data k;
  4.     k.a = 100;
  5.     k.b = 300;
  6.     // 注意这里,会出大事
  7.     s = &k;
  8. }
复制代码
parent 是父级对象,由调用者传递,这取决于这个自定义的 action 用在什么容器上了,如果用在菜单上,就是 QMenu 对象。返回值就是创建的自定义组件了。
另外,如果在析构自定义组件时有特殊处理,还可以重写 delete 方法。
  1. a = 100
  2. b = 300
复制代码
widget 参数是要被删除的自定义组件实例。如果无其他要实现的需求,没必要重写它。
下面咱们来个示例:自定义组件做个带三个滑块的界面。组件名称为 CustWidget,基类是 QFrame。选择 QFrame 作为基类是方便设置边框。
  1. #include <iostream>
  2. class Test
  3. {
  4. public:
  5.     Test()
  6.     {
  7.         std::cout << "Test 构造函数 ..." << std::endl;
  8.     }
  9.     ~Test()
  10.     {
  11.         std::cout << "Test 析构函数 ..." << std::endl;
  12.     }
  13.     int a,b;
  14. };
  15. // 注意这里
  16. Test *s;
  17. void doSome()
  18. {
  19.     Test k;
  20.     k.a= 100;
  21.     k.b = 300;
  22.     // 注意这里,会出大事
  23.     s = &k;
  24. }
  25. int main()
  26. {
  27.     // 先调用了函数
  28.     std::cout << "调用doSome函数前\n";
  29.         doSome();
  30.     std::cout << "调用doSome函数后\n";
  31.     // 再输出a、b的内容
  32.     std::cout << "a = " << s->a << '\n';
  33.     std::cout << "b = " << s->b << '\n';
  34.     return 0;
  35. }
复制代码
滑块条是 QSlider 组件,它默认的方向是垂直的,所以要将方向设定为水平。自定义组件还用到了 QFormLayout 类,它是布局类,类似 HTML Form 元素的布局方式,即表单。一般分为两列,左列是字段标题,右列是字段内容。
CustWidget 组件定义好了,接下来就是 MyWidgetAction 类,派生自 QWidgetAction。
  1. Test 构造函数 ...
  2. Test 析构函数 ...
  3. 调用doSome函数后
  4. a = -858993460
  5. b = -858993460
复制代码
整体逻辑很简单,就是返回 CustWidget 的实例。
 
然后咱们在前面 QWidgetAction 的示例上再添加一个菜单项,使用咱们刚定义的 MyWidgetAction。
  1. void doSome()
  2. {
  3.     Test *k = new Test;
  4.     k->a = 100;
  5.     k->b = 300;
  6.     // 复制的是地址,不是对象
  7.     s = k;
  8. }
复制代码
最后,咱们来看看效果。

这效果不错吧。
好了,今天就水到这里了,有空咱们继续聊。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表