Qt自定义菜单

news2025/2/22 9:25:22

 Qt开发过程中,弹出菜单时我们一般使用QMenu,但是QMenu都是一条项固定的格式,如查想要自己的设计界面就没法使用默认的Action项了,因此我们得用自定义的QMenu。

本篇介绍使用自定义的QMenu设计出UI。我们使用QWidget + QWidgetAction来实现。QWidgetAction继承自QAction,无法通过继承来实现一个界面,但它提供了setDefaultWidget来绑定一个界面,使用起来就更加方便了。

首先创建一个PlayWidget带UI的类,里面添加两个按钮,然后把这个类嵌进QWidgetAction中。代码如下:

#ifndef PLAYWIDGET_H
#define PLAYWIDGET_H

#include <QWidget>

namespace Ui {
class PlayWidget;
}

class PlayWidget : public QWidget
{
    Q_OBJECT

public:
    explicit PlayWidget(QWidget *parent = nullptr);
    ~PlayWidget();

private:
    Ui::PlayWidget *ui;
};

#endif // PLAYWIDGET_H

#include "playwidget.h"
#include "ui_playwidget.h"

PlayWidget::PlayWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PlayWidget)
{
    ui->setupUi(this);
}

PlayWidget::~PlayWidget()
{
    delete ui;
}
void CustomMenu::initData()
{
    QString strLineEditStyle = QString("QLineEdit{background-color:#E9E9EA;color:#6D6E6B;border-radius:8px;}"
                                       "QLineEdit:hover{background-color:#E9E9EA;border-radius:8px;border:2px solid rgba(47, 137, 252, 1);}"
                                       "QLineEdit:focus{background-color:#E9E9EA;border-radius:8px;border:2px solid rgba(47, 137, 252, 1);}"
                                       "QLineEdit:disabled{background-color:#F0F0F0;border-radius:8px;}");
    QFont font = qApp->font();
    font.setPixelSize(12);


    QLineEdit *pLineEdit = new QLineEdit(this);
    pLineEdit->setFont(font);
    pLineEdit->setMaximumSize(QSize(86, 24));
    pLineEdit->setMinimumSize(QSize(86, 24));
    pLineEdit->setStyleSheet(strLineEditStyle);
    //播放项
    QWidgetAction *pWdtAction = new QWidgetAction(this);
    //播放项界面,继承自QWidget的类
    PlayWidget *playWdt = new PlayWidget(this);
    playWdt->setMinimumSize(QSize(200, 50));
    pWdtAction->setDefaultWidget(playWdt);

    //创建一个包含声音调整控件的界面项
    QWidgetAction *pVoice = new QWidgetAction(this);
    QWidget *pVoiceWdt = new QWidget(this);
    QSlider *pSlider = new QSlider(Qt::Horizontal);
    QHBoxLayout *layout = new QHBoxLayout(pVoiceWdt);
    layout->addWidget(pSlider);
    layout->addWidget(pLineEdit);
    pVoiceWdt->setLayout(layout);
    pVoice->setDefaultWidget(pVoiceWdt);
    //生成菜单栏
    if(m_menu == nullptr) {
        m_menu = new QMenu(this);
        m_menu->addAction(pWdtAction);
        m_menu->addSeparator();
        m_menu->addAction(pVoice);
        m_menu->addAction(QStringLiteral("显示歌词"));
        m_menu->addAction(QStringLiteral("锁定歌词"));

        m_menu->addSeparator();
        m_menu->addAction(QStringLiteral("选项设置"));
        m_menu->addSeparator();
        m_menu->addAction(QStringLiteral("登陆"));
        m_menu->addAction(QStringLiteral("退出"));
    }
}

void CustomMenu::initConnect()
{
    connect(ui->btnCreateMenu, SIGNAL(clicked()), this, SLOT(slotCreateMenu()));
}


void CustomMenu::slotCreateMenu()
{
    QPoint point = ui->btnCreateMenu->pos();
    point.setY(point.y() + 50);
    m_menu->popup(this->mapToGlobal(point));
    //ui->btnCreateMenu->setMenu(m_menu);

}

 运行效果

这是使用QMenu的方式,还有一个直接使用QWidget的方式,把属性设置为

setWindowFlags(Qt::FramelessWindowHint|Qt::Popup);

这样弹出菜单后,点击其他地方会自动关闭此Widget,达到与弹出菜单一样的效果。

完整代码如下:

#ifndef PROVINCEWIDGET_H
#define PROVINCEWIDGET_H

#include <QWidget>

class QLineEdit;
class QListView;

class ProvinceWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ProvinceWidget(QWidget *parent = nullptr);

    void initView();
    void initConnect();
    void setClearFocus();

signals:
    void signalChangeScale(int scale);

protected:
    void paintEvent(QPaintEvent *event) override;

public slots:
    void slotReturnPressed();
    void slotEditingFinished();
    void slotClicked(const QModelIndex &index);

private:
    QListView *m_listView;
    QLineEdit *m_lineEdit;


};

#endif // PROVINCEWIDGET_H

#include "provincewidget.h"
#include <QGraphicsDropShadowEffect>
#include <QPainter>
#include <QtMath>
#include <QStyleOption>
#include <QBitmap>
#include <QApplication>
#include <QStringListModel>
#include <QVBoxLayout>
#include <QDebug>
#include <QListView>
#include <QLineEdit>

ProvinceWidget::ProvinceWidget(QWidget *parent)
    : QWidget{parent}
    ,m_listView(new QListView(this))
    ,m_lineEdit(new QLineEdit(this))
{
    setWindowFlags(Qt::FramelessWindowHint|Qt::Popup);
    initView();
    initConnect();
}

void ProvinceWidget::initView()
{
    QString strLineEditStyle = QString("QLineEdit{background-color:#E9E9EA;color:#6D6E6B;padding-left:20px;border-radius:8px;}"
                                       "QLineEdit:hover{background-color:#E9E9EA;border-radius:8px;border:2px solid rgba(47, 137, 252, 1);}"
                                       "QLineEdit:focus{background-color:#E9E9EA;border-radius:8px;border:2px solid rgba(47, 137, 252, 1);}"
                                       "QLineEdit:disabled{background-color:#F0F0F0;border-radius:8px;}");
    QFont font = qApp->font();
    font.setPixelSize(14);
    m_lineEdit->setFont(font);
    m_lineEdit->setMaximumSize(QSize(108, 24));
    m_lineEdit->setMinimumSize(QSize(108, 24));
    m_lineEdit->setStyleSheet(strLineEditStyle);


    // 使用QListView显示一个简单的列表
    QStringListModel* model = new QStringListModel();
    model->setStringList({QStringLiteral("广东"), QStringLiteral("广西"), QStringLiteral("海南"),QStringLiteral("云南"), QStringLiteral("浙江"), QStringLiteral("江西"),QStringLiteral("北京"), QStringLiteral("黑龙江")});

    m_listView->setModel(model);
    //margin item离外边框的间距 padding 内容与item项的边框
    QString listViewStyle = QString("QListView{color:#6D6E6B; background-color:white;border:none;outline:none;}"
                                    "QListView::item{height:24px;background:gray;margin-top:3px; margin-right:10px;margin-bottom:4px; margin-left:10px;padding-left:20px;padding-right:10px;color:#333333;border:none;outline:none;}"
                                    "QListView::item:hover{background:#2F89FC;color:#ffffff;border-radius:4px;border:none;outline:none;}"
                                    "QListView::item:selected{background:white;color:#ff0000;border:none;outline:none;}"
                                    "QListView::item:selected:!active{background:white;color:#00ff00;border:none;outline:none;}"
                                    "QListView::item:selected:active{background:white;color:#0000ff;border:none;outline:none;}");

    QString listViewStyle2 = QString("QListView{color:#6D6E6B; background-color:white;border:none;outline:none;}"
                            "QListView::item{height:24px;background:white;margin-top:3px; margin-right:10px;margin-bottom:4px; margin-left:10px;padding-left:20px;padding-right:10px;color:#333333;border:none;outline:none;}"
                            "QListView::item:hover{background:#2F89FC;color:#ffffff;border-radius:4px;border:none;outline:none;}"
                            "QListView::item:selected{background:white;color:#ff0000;border:none;outline:none;}"
                            "QListView::item:selected:!active{background:white;color:#00ff00;border:none;outline:none;}"
                            "QListView::item:selected:active{background:white;color:#0000ff;border:none;outline:none;}");

    m_listView->setStyleSheet(listViewStyle2);

    QVBoxLayout *layout = new QVBoxLayout();
    layout->setContentsMargins(0, 1, 0, 0);
    layout->setSpacing(1);
    layout->addWidget(m_listView);
    layout->addWidget(m_lineEdit);
    setLayout(layout);
}

void ProvinceWidget::initConnect()
{
    connect(m_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturnPressed()));
    connect(m_lineEdit, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished()));
    connect(m_listView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotClicked(const QModelIndex &)));
}

void ProvinceWidget::setClearFocus()
{
    m_listView->clearFocus();
    m_listView->clearSelection();
    m_lineEdit->clearFocus();
}


void ProvinceWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
//    QPainterPath path;
//    path.setFillRule(Qt::WindingFill);
//    path.addRoundedRect(5, 5, this->width() - 5 * 2, this->height() - 5 * 2, 3, 3);
//    painter.fillPath(path, QBrush(Qt::red));

    //绘制样式
    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);//绘制样式
    QBitmap bmp(this->size());
    bmp.fill();
    QPainter painter(&bmp);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::black);
    painter.setRenderHint(QPainter::Antialiasing);
    //设置边框为圆角12px
    painter.drawRoundedRect(bmp.rect(), 8, 8);
    setMask(bmp);

    //再画颜色块
    QRect tmpRect = QRect(0, 0, this->width(), this->height());
    QBrush brush = QBrush(QColor("#ffffff"));
    p.setPen(Qt::NoPen);  //去掉边框线
    p.setBrush(brush);
    p.drawRect(tmpRect);



//    QColor color(Qt::gray);
//    for (int i = 0; i < 5; i++)
//    {
//        QPainterPath path;
//        path.setFillRule(Qt::WindingFill);
//        path.addRoundedRect(5 - i, 5 - i, this->width() - (5 - i) * 2, this->height() - (5 - i) * 2, 3 + i, 3 + i);
//        color.setAlpha(80 - qSqrt(i) * 40);
//        painter.setPen(color);
//        painter.drawPath(path);
//    }

}

void ProvinceWidget::slotReturnPressed()
{
    int scale = m_lineEdit->text().toInt();
    qDebug() << "slotReturnPressed===========================" << scale;
    emit signalChangeScale(scale);
}

void ProvinceWidget::slotEditingFinished()
{
    int scale = m_lineEdit->text().toInt();
    qDebug() << "slotEditingFinished===========================" << scale;
}

void ProvinceWidget::slotClicked(const QModelIndex &index)
{
    QString data = index.data().toString();
    int scale = data.left(data.size() - 1).toInt();
    qDebug() << "PopupScaleList::slotClicked==========data======" << data << data.size() << scale;
    emit signalChangeScale(scale);
}

#ifndef CUSTOMMENU_H
#define CUSTOMMENU_H

#include <QMainWindow>
#include "provincewidget.h"

class QMenu;

QT_BEGIN_NAMESPACE
namespace Ui { class CustomMenu; }
QT_END_NAMESPACE

class CustomMenu : public QMainWindow
{
    Q_OBJECT

public:
    CustomMenu(QWidget *parent = nullptr);
    ~CustomMenu();

    void initData();
    void initConnect();

public slots:
    void slotCreateMenu();
    void slotPopupMenu();
    void slotTriggered(QAction *action);

private:
    Ui::CustomMenu *ui;
    ProvinceWidget *provinceWidget{nullptr};
    QMenu *m_menu{nullptr};

};
#endif // CUSTOMMENU_H

#include "custommenu.h"
#include "ui_custommenu.h"
#include "playwidget.h"
#include <QWidgetAction>
#include <QMenu>
#include <QSlider>
#include <QHBoxLayout>
#include <QDebug>
#include <QLineEdit>

CustomMenu::CustomMenu(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CustomMenu)
{
    ui->setupUi(this);

    initData();
    initConnect();
}

CustomMenu::~CustomMenu()
{
    delete ui;
}



void CustomMenu::initData()
{

    provinceWidget = new ProvinceWidget(this);
    provinceWidget->setObjectName(QString::fromUtf8("provinceWidget"));
    provinceWidget->setMinimumSize(QSize(108, 280));
    provinceWidget->setMaximumSize(QSize(108, 280));

    QString strLineEditStyle = QString("QLineEdit{background-color:#E9E9EA;color:#6D6E6B;border-radius:8px;}"
                                       "QLineEdit:hover{background-color:#E9E9EA;border-radius:8px;border:2px solid rgba(47, 137, 252, 1);}"
                                       "QLineEdit:focus{background-color:#E9E9EA;border-radius:8px;border:2px solid rgba(47, 137, 252, 1);}"
                                       "QLineEdit:disabled{background-color:#F0F0F0;border-radius:8px;}");
    QFont font = qApp->font();
    font.setPixelSize(12);


    QLineEdit *pLineEdit = new QLineEdit(this);
    pLineEdit->setFont(font);
    pLineEdit->setMaximumSize(QSize(86, 24));
    pLineEdit->setMinimumSize(QSize(86, 24));
    pLineEdit->setStyleSheet(strLineEditStyle);
    //播放项
    QWidgetAction *pWdtAction = new QWidgetAction(this);
    //播放项界面,继承自QWidget的类
    PlayWidget *playWdt = new PlayWidget(this);
    playWdt->setMinimumSize(QSize(200, 50));
    pWdtAction->setDefaultWidget(playWdt);

    //创建一个包含声音调整控件的界面项
    QWidgetAction *pVoice = new QWidgetAction(this);
    QWidget *pVoiceWdt = new QWidget(this);
    QSlider *pSlider = new QSlider(Qt::Horizontal);
    QHBoxLayout *layout = new QHBoxLayout(pVoiceWdt);
    layout->addWidget(pSlider);
    layout->addWidget(pLineEdit);
    pVoiceWdt->setLayout(layout);
    pVoice->setDefaultWidget(pVoiceWdt);
    //生成菜单栏
    if(m_menu == nullptr) {
        m_menu = new QMenu(this);
        m_menu->addAction(pWdtAction);
        m_menu->addSeparator();
        m_menu->addAction(pVoice);
        m_menu->addAction(QStringLiteral("显示歌词"));
        m_menu->addAction(QStringLiteral("锁定歌词"));

        m_menu->addSeparator();
        m_menu->addAction(QStringLiteral("选项设置"));
        m_menu->addSeparator();
        m_menu->addAction(QStringLiteral("登陆"));
        m_menu->addAction(QStringLiteral("退出"));
    }
}

void CustomMenu::initConnect()
{
    connect(ui->btnCreateMenu, SIGNAL(clicked()), this, SLOT(slotCreateMenu()));
    connect(ui->btnPopupMenu, SIGNAL(clicked()), this, SLOT(slotPopupMenu()));
    connect(m_menu, SIGNAL(triggered(QAction *)), this, SLOT(slotTriggered(QAction *)));
}


void CustomMenu::slotCreateMenu()
{
    QPoint point = ui->btnCreateMenu->pos();
    point.setY(point.y() + 50);
    m_menu->popup(this->mapToGlobal(point));
    //ui->btnCreateMenu->setMenu(m_menu);

}

void CustomMenu::slotPopupMenu()
{
    QPoint point = ui->btnPopupMenu->pos();
    point.setY(point.y() + 50);
    QPoint mapPoint = mapToGlobal(point);
    provinceWidget->setClearFocus();
    provinceWidget->move(mapPoint);
    provinceWidget->show();
}

void CustomMenu::slotTriggered(QAction *action)
{
    qDebug() << "slotCreateMenu====================" << action->text();
}

#include "custommenu.h"

#include <QApplication>
#include <QFont>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont defaultFont = qApp->font();
    defaultFont.setFamily("Microsoft YaHei");
    qApp->setFont(defaultFont);
    CustomMenu w;
    w.show();
    return a.exec();
}

运行效果:

 

参考:

https://www.cnblogs.com/lingluotianya/p/3789245.html
https://blog.csdn.net/yyz_1987/article/details/130986313

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1056268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录 Day8 栈(FILO)与队列(FIFO) LeetCode T232 用栈实现队列 LeetCodeT225 用队列实现栈

题目详细思路来自于:代码随想录 (programmercarl.com) 栈和队列都是大家不陌生的数据结构,我们之前的栈和队列一般是用数组或链表来实现的 , 这里我们给出实现方式,用于帮助更好的理解. 1.用链表实现栈 /* 基于链表实现的栈 */ class LinkedListStack { private ListNode sta…

记录我的网站的上线的全过程

我的网站开发全过程记录: 提示: 大部分是cv代码,少部分样式进行了修改和借鉴,主要花费时间在部署上面,出现的问题 开始: 三个博主: 在掘金上认识了搜狐前端-- 英杰 , 掘金链接:yingjieweb 的个人主页 - 动态 - 掘金 偶然间看见了英杰的网站,感觉非常不错,产生自己弄的想法,…

mybatis-spring集成数据库连接池开启注解式开发

目录 1. 引入依赖包 2. 集成配置文件 2.1 开启注解式开发 2.2 spring引入外部配置文件 2.3 数据库连接池 2.4 spring整合mybatis 2.5 自动代理 3. 注解式开发的几个常用注解 4. spring-test 附录一&#xff1a;spring常用注解 1. 引入依赖包 <!--spring整合mybat…

【面试经典150 | 矩阵】旋转图像

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地旋转方法二&#xff1a;翻转代替旋转 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带…

Mac安装Ecplise产品报错:dose not contain the JNI_CreateJavaVM symbol

1. 絮絮叨叨 工作中需要借助Ecplise Memory Analyzer (MAT)分析dump文件&#xff0c;直接下载、安装、运行MAT报错 询问同事后&#xff0c;同事说可以先安装Ecplise&#xff0c;再以插件的形式安装MAT下载、安装好Eclipse&#xff0c;点击运行仍然报错&#xff0c;且错误信息一…

区块链3.0时代 基于GoMars构建的新概念TravelFi能否注入新力量?

区块链技术进入3.0时代 后疫情时代&#xff0c;全球数字化进程不断加快&#xff0c;世界范围内的移动通信、互联网技术及各类数字化应用的社会普及率也正在快速提升&#xff0c;疫情推动了互联网经济的增长&#xff0c;也让数字经济的价值开始显现。 数字经济一词的由来至今已经…

2023最新注册小程序以及云开发环境的创建

前言&#xff1a; 我们前面虽然可以用测试号创建小程序,但是测试号有很多功能会受限,比如我们接下来要讲的云开发,必须是注册小程序后才可以使用, 一&#xff0c;注册小程序 官方注册文档&#xff1a; 产品定位及功能介绍 | 微信开放文档 (qq.com)https://developers.weixin.…

servlet 线程模型 异步

在 servlet 3.0 之前&#xff0c;请求与线程的对应关系是1:1&#xff0c;对应jvm与操作系统的线程的关系。 https://jcp.org/en/jsr/detail?id315 https://jcp.org/en/jsr/detail?id340 从 servlet 3.0 开始&#xff0c;开始有了异步相关功能 容器线程池与业务线程池开始单独…

第九章 动态规划 part13 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

第五十二天| 第九章 动态规划 part13 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 一、300. 最长递增子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-increasing-subsequence/ 题目介绍&#xff1a; 给你一个整数数组 nums &#xff…

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

力扣-169. 多数元素(C语言+分治递归)

1. 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 2. 输入输出样例 示例1 输入&#xff1a;nums [3,2,3] 输出&#xff…

指定vscode黏贴图片路径(VSCode 1.79 更新)

指定vscode黏贴图片路径(VSCode 1.79 更新) 设置中搜索"markdown.copyFiles.destination" 点击AddItem,配置你的key-value&#xff0c;完成。

VUE2项目:尚品汇-axios二次封装请求以及VUEX的状态管理库

上一篇&#xff1a;VUE2项目&#xff1a;尚品汇VUE-CLI脚手架初始化项目以及路由组件分析&#xff08;一&#xff09; 目录 axios二次封装API接口管理与解决跨域API接口管理nprogress进度条配置 VUEX状态管理库三级分类动态背景颜色防抖三级联动跳转路由分析 axios二次封装 项…

12链表-双指针

目录 LeetCode之路——21. 合并两个有序链表 分析&#xff1a; LeetCode之路——19. 删除链表的倒数第 N 个结点 分析&#xff1a; LeetCode之路——21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的…

网络运营和电子商务有什么区别

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 一个同学他问我&#xff0c;他说学网络运营的话&#xff0c;它是不是电子商务里面的这个东西&#xff1f;像电子大…

二十六、设置时序电路初始状态的方法(初始值设置)(时序电路置数)2

方法2 在理解方法1的化简(1)这个方法后,又可以想到输入触发器R和S两个输入端的信号也无非就是0和1。那么直接用LOAD这个信号接在R和S两个输入端上即可。 先用开关判断触发器的R和S是低电平触发还是高电平触发(下图触发器可以直接看出为低电平触发,但是实际用管子搭建的触…

【那些年写过的愚蠢代码】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用&#xff1a; 一…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…

javaSwing销售管理

​ 目录 一、选题背景 近几年来&#xff0c;传统商业与电商似乎是水火不容&#xff0c;大有不是你死便是我活的劲头。一直以来舆论都是一边倒的电商将迅速取代传统零售的论调&#xff0c;然而几年过去&#xff0c;电商的发展确实值得侧目&#xff0c;但传统商业虽然受到不小的…