在Qt工具栏上实现矩阵并排的按钮效果源码

如果这个要用MFC去实现头皮都得掉一层,建议大家以后要写GUI方面的小工具尽量转QT或其他吧,MFC真不适合搞这种花里胡哨的界面.

在Qt工具栏上实现矩阵并排的按钮效果源码如下:

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QGridLayout>
#include <QPushButton>

class QxBtnMatrix : public QWidget {
public:
    QxBtnMatrix (QWidget *parent = nullptr) : QWidget(parent) {
        QGridLayout *layout = new QGridLayout(this);

        // 添加上排矩阵按钮
        for (int i = 0; i < 4; ++i)
        {
            QPushButton *button = new QPushButton(QString("A%1").arg(i + 1));
            layout->addWidget(button, 0, i);
            m_lstTypeA.push_back(button);
            connect(button, &QPushButton::clicked, this, &QxBtnMatrix::OnClickTypeA);
        }

        // 添加下排矩阵按钮
        for (int i = 0; i < 4; ++i)
        {
            QPushButton *button = new QPushButton(QString("B%1").arg(i + 1));
            layout->addWidget(button, 1, i);
            m_lstTypeB.push_back(button);
            connect(button, &QPushButton::clicked, this, &QxBtnMatrix::OnClickTypeB);
        }

        // 设置布局间距和按钮大小
        layout->setSpacing(2); // 设置按钮之间的间距
        layout->setContentsMargins(1, 1, 1, 1); // 设置边距

        // 调整按钮大小
        QList<QPushButton *> buttons = findChildren<QPushButton *>();
        for (QPushButton *button : buttons) {
            button->setFixedSize(24, 16); // 设置按钮固定大小
            button->setStyleSheet("QPushButton {"
                          "border: 2px solid #8f8f91;"
                          "border-radius: 6px;"
                          "min-width: 24px;"
                          "background-color: #f6f7fa;"
                          "}"
                          "QPushButton:pressed {"
                          "background-color: #dadbde;"
                          "}");
        }
    }


private slots:
    void OnClickTypeA()
    {
        QPushButton *clickedBtn = qobject_cast<QPushButton  *>(sender());
        if(!clickedBtn)
            return;

        for(QPushButton *btn : m_lstTypeA)
        {
            if(btn != clickedBtn)
            {
                btn->setStyleSheet("QPushButton {"
                          "border: 2px solid #8f8f91;"
                          "border-radius: 6px;"
                          "min-width: 24px;"
                          "background-color: #f6f7fa;"
                          "}"
                          "QPushButton:pressed {"
                          "background-color: #dadbde;"
                          "}");
            }
            else
            {
                btn->setStyleSheet("QPushButton {"
                          "border: 2px solid #8f8f91;"
                          "border-radius: 6px;"
                          "min-width: 24px;"
                          "background-color: #ff0000;"
                          "}"
                          "QPushButton:pressed {"
                          "background-color: #ff0000;"
                          "}");
            }
        }
    }

    void OnClickTypeB()
    {
        QPushButton *clickedBtn = qobject_cast<QPushButton  *>(sender());
        if(!clickedBtn)
            return;

        for(QPushButton *btn : m_lstTypeB)
        {
            if(btn != clickedBtn)
            {
                btn->setStyleSheet("QPushButton {"
                          "border: 2px solid #8f8f91;"
                          "border-radius: 6px;"
                          "min-width: 24px;"
                          "background-color: #f6f7fa;"
                          "}"
                          "QPushButton:pressed {"
                          "background-color: #dadbde;"
                          "}");
            }
            else
            {
                btn->setStyleSheet("QPushButton {"
                          "border: 2px solid #8f8f91;"
                          "border-radius: 6px;"
                          "min-width: 24px;"
                          "background-color: #ff0000;"
                          "}"
                          "QPushButton:pressed {"
                          "background-color: #ff0000;"
                          "}");
            }
        }
    }

public:
    QList<QPushButton *>    m_lstTypeA, m_lstTypeB;
};


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

    // 创建按钮矩阵小部件
    QxBtnMatrix *btnMatrix = new QxBtnMatrix(this);

    // 将按钮矩阵小部件添加到工具栏中
    ui->toolBar->addSeparator();
    ui->toolBar->addWidget(btnMatrix);
    ui->toolBar->addSeparator();

    // 添加打开
    ui->toolBar->addAction(ui->actionOpen);
}

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

运行后的效果如下图:

相关推荐
\光辉岁月/3 分钟前
15.JavaSE-网络
java·开发语言·网络
兰亭妙微UI设计公司9 分钟前
兰亭妙微软件界面设计公司的解锁按钮设计10大密码
开发语言·前端·javascript
人邮异步社区15 分钟前
C语言好学,还是Python好学?
c语言·开发语言·python
栈帧之外32 分钟前
【C++】红黑树实现
开发语言·c++
程序员老陆34 分钟前
C++中同一个回调函数被多个设备并发调用:并发问题不在“函数”,而在“状态”
开发语言·c++·程序设计
辛苦才能36 分钟前
C++ unordered_map/set 深度解析:快在O(1),输在无序,与map/set怎么选
c++·哈希算法·散列表
wangchunyu11437 分钟前
JDK8新特性实战(Lambda、Stream、Optional)
java·开发语言
鱼宵41 分钟前
工厂模式实战:消灭魔法数字,把写死的 new 收进一个厂里
开发语言·python
niucloud-admin1 小时前
NIUCLOUD LITE AI开发文档--后台系统结构
开发语言
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 登录发送验证码的测试验证与经验复盘
java·开发语言·交友