设为首页 加入收藏

TOP

【Qt6】QWidgetAction 的使用(二)
2023-08-26 21:10:53 】 浏览:177
Tags:Qt6 QWidgetAction
on("No"); // 创建顶层窗口 QWidget *window = new QWidget; // 构建对象树 btnA->setParent(window); btnB->setParent(window); // 设置按钮在窗口中的位置 btnA->move(28, 30); btnB->move(28, 75); // 显示窗口 window->show(); return QApplication::exec(); }

这里咱们也不需要 delete,毕竟窗口和两个按钮在应用程序运行期间它们都必须存在的,只到了程序退出时才销毁,那就没必要 delete 了。

所以说:

1、不是所有指针变量都要 delete 的,因为它引用的可能不是堆上的对象,没准是栈上的对象;

2、不是所有 new 出来的对象就非要 delete 不可,主要看它的生命周期是否该结束。如果是短暂使用的,在应用程序运行期间不需要一直存在的,用完就要 delete。有些 new 出来的对象可能要传递给其他对象用,并由它们负责释放,那也不需要 delete,比如包装剪贴板数据的 QMimeData 类。

==========================================================================

好了,以上一大段内容就当作科普,正片现在才开始。本篇咱们看一下特殊的 QAction 类——QWidgetAction。看名字也可以联想到,它是可以把一个 QWidget 用作 action 的类。这个有什么用呢?作用就是你可以在菜单里做些交互功能。

 QWidgetAction 类有两种用法:

1、直接用,这是最简单方法。实例化后调用 setDefaultWidget 方法设置一个 widget;

2、派生出子类,重写 createWidget 方法,创建你需要的组件对象。

先看第一种用法,非常好办,你想在菜单项上显示什么组件就创建它,然后调用 setDefaultWidget 方法就行了。

// 头文件
#ifndef APP_H
#define APP_H

#include <QMainWindow>
#include <QWidget>
#include <QAction>
#include <QSpinBox>
#include <QMenu>
#include <QMenuBar>
#include <QWidgetAction>

class MyWindow : public QMainWindow
{
public:
    MyWindow();
};

#endif
/*---------------------------------------------*/
// 代码文件
MyWindow::MyWindow()
    :QMainWindow((QWidget*)nullptr)
{
    // 创建菜单栏
    QMenuBar *menubar = this->menuBar();
    // 创建菜单
    QMenu *menu = menubar->addMenu("应用程序");
    // 添加两个普通action,意思一下
    menu->addAction("打开文件");
    menu->addAction("关闭文件");
    // 下面才是主角
    QWidgetAction *widgetAct = new QWidgetAction(menu);
    // 创建一个数字组件
    QSpinBox *spinbox = new QSpinBox;
    // 设置一下有效范围
    spinbox->setRange(0, 1000);
    // 设置当前值
    spinbox->setValue(250);
    // 设置为 QWidgetAction 的默认组件
    widgetAct->setDefaultWidget(spinbox);
    // 把action添加到菜单中
    menu->addAction(widgetAct);
}

应用程序窗口继承了 QMainWindow 类,因为这个类比较方便构建菜单栏、工具栏、状态栏、停靠栏。咱们用它来创建一个菜单栏对象(QMenuBar),然后添加一个叫“应用程序”的菜单(QMenu)。

“应用程序”菜单的前两个菜单项是普通的 action,第三个是 QWidgetAction 对象。在 new 出 QWidgetAction 后,先初始化一下 QSpinBox 组件,然后调用 setDefaultWidget 方法,这样 QSpinBox 组件就能显示在菜单项上了。

在 main 函数中显示主窗口。

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    MyWindow *win = new MyWindow;
    win->setWindowTitle("自定义菜单项");
    win->resize(450, 400);
    win->show();
    return QApplication::exec();
}

好了,见证奇迹的时候到了,看看效果。

 

另一种用法,就是从 QWidgetAction 类派生。然后重写这个方法:

QWidget *createWidget(QWidget *parent);

parent 是父级对象,由调用者传递,这取决于这个自定义的 action 用在什么容器上了,如果用在菜单上,就是 QMenu 对象。返回值就是创建的自定义组件了。

另外,如果在析构自定义组件时有特殊处理,还可以重写 delete 方法。

void deleteWidget(QWidget *widget);

widget 参数是要被删除的自定义组件实例。如果无其他要实现的需求,没必要重写它。

下面咱们来个示例:自定义组件做个带三个滑块的界面。组件名称为 CustWidget,基类是 QFrame。选择 QFrame 作为基类是方便设置边框。

// 头文件
#ifndef CUSTWIDGET_H
#define CUSTWIDGET_H
#include <QWidget>
#include <QFrame>

class CustWidget: public QFrame
{
public:
    CustWidget(QWidget* parent = nullptr);
private:
    void initUI();
};
#endif

// 代码文件
#include "custWidget.h"
#include <QFormLayout>
#include <QSlider>

CustWidget::CustWidget(QWidget *parent)
    :QFrame::QFrame(parent)
{
    this->initUI();
}

void CustWidget::initUI()
{
    // 创建布局
    QFormLay
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇linux c++ tcp 下一篇C++项目实战之演讲比赛流程管理系..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目