zoukankan      html  css  js  c++  java
  • Qt 自定义QToolButton 自己互斥同时工具按钮之间实现互斥

    工作中没有小事:点石成金,滴水成河,只有认真对待自己所做的一切事情,才能克服万难,取得成功。

    一、自定义QToolButton

      QEditToolButton.h

    class QEditToolButton : public QToolButton
    {
        Q_OBJECT
    public:
        QEditToolButton(QWidget* parent);
        ~QEditToolButton();
    
        void SetToolName(const std::string& sEditToolName);
    
    
    public Q_SLOTS:
        void OnSlotTooButtonChanged(std::string& sEditToolName);
        void OnSlotResetTooButton(std::string& sEditToolName);
    
    private:
        //! Tool associated with this button.
        std::string m_ToolName;
    
    };

    QEditToolButton.cpp

    #include "QEditToolButton.h"
    
    QEditToolButton::QEditToolButton(QWidget* parent)
        : QToolButton(parent)
    {
        setCheckable(true);
    }
    
    QEditToolButton::~QEditToolButton()
    {
    
    }
    
    void QEditToolButton::SetToolName(const std::string& sEditToolName)
    {
        m_ToolName = sEditToolName;
    }
    
    
    void QEditToolButton::OnSlotTooButtonChanged(std::string& sEditToolName)
    {
        if (sEditToolName != m_ToolName)
        {
            if (isChecked())
                setChecked(false);
        }
        else
        {
            if (!isChecked())
                setChecked(true);
        }
    }
    
    void QEditToolButton::OnSlotResetTooButton(std::string& sEditToolName)
    {
        if (sEditToolName == m_ToolName)
        {
            if (isChecked())
                setChecked(false);
            return;
        }
    }

    二、使用自定义QToolButton

    class QMyWidget : public QWidget
    {
        Q_OBJECT
    #include "QMyWidget.h"
    #include <QToolButton>
    #include <QHBoxLayout>
    #include "QEditToolButton.h"
    
    QMyWidget::QMyWidget(QWidget *parent)
        : QWidget(parent)
    {
        setFixedSize(400, 600);
        const QSize btnSize(90, 40);
        QHBoxLayout* pHBox = new QHBoxLayout();
        QEditToolButton* pToolBtn1 = new QEditToolButton(this);
        pToolBtn1->setObjectName("test1");
        pToolBtn1->setText(QStringLiteral("测试1"));
        pToolBtn1->setCheckable(true);
        pToolBtn1->setFixedSize(btnSize);
        pToolBtn1->SetToolName("test1");
    
        QEditToolButton* pToolBtn2 = new QEditToolButton(this);
        pToolBtn2->setObjectName("test2");
        pToolBtn2->setText(QStringLiteral("测试2"));
        pToolBtn2->setCheckable(true);
        pToolBtn2->setFixedSize(btnSize);
        pToolBtn2->SetToolName("test2");
    
        QEditToolButton* pToolBtn3 = new QEditToolButton(this);
        pToolBtn3->setObjectName("test3");
        pToolBtn3->setText(QStringLiteral("测试3"));
        pToolBtn3->setCheckable(true);
        pToolBtn3->setFixedSize(btnSize);
        pToolBtn3->SetToolName("test3");
    
        pHBox->addWidget(pToolBtn1);
        pHBox->addWidget(pToolBtn2);
        pHBox->addWidget(pToolBtn3);
        setLayout(pHBox);
    
    
        connect(pToolBtn1, &QToolButton::clicked, this, &QMyWidget::OnSlotTool1);
        connect(pToolBtn2, &QToolButton::clicked, this, &QMyWidget::OnSlotTool2);
        connect(pToolBtn3, &QToolButton::clicked, this, &QMyWidget::OnSlotTool3);
    
        connect(this, &QMyWidget::signalToolButtonChanged, pToolBtn1, &QEditToolButton::OnSlotTooButtonChanged);
        connect(this, &QMyWidget::signalToolButtonChanged, pToolBtn2, &QEditToolButton::OnSlotTooButtonChanged);
        connect(this, &QMyWidget::signalToolButtonChanged, pToolBtn3, &QEditToolButton::OnSlotTooButtonChanged);
    }
    
    void QMyWidget::OnSlotTool1(bool bChecked)
    {
        if (bChecked)
        {
            QEditToolButton* pToolBtn = (QEditToolButton*)sender();
            if (pToolBtn)
            {
                QString qstrname = pToolBtn->objectName();
                std::string strname = qstrname.toLocal8Bit();
                emit signalToolButtonChanged(strname);
            }
        }
    }
    
    void QMyWidget::OnSlotTool2(bool bChecked)
    {
        if (bChecked)
        {
            QEditToolButton* pToolBtn = (QEditToolButton*)sender();
            if (pToolBtn)
            {
                QString qstrname = pToolBtn->objectName();
                std::string strname = qstrname.toLocal8Bit();
                emit signalToolButtonChanged(strname);
            }
        }
    }
    
    void QMyWidget::OnSlotTool3(bool bChecked)
    {
        if (bChecked)
        {
            QEditToolButton* pToolBtn = (QEditToolButton*)sender();
            if (pToolBtn)
            {
                QString qstrname = pToolBtn->objectName();
                std::string strname = qstrname.toLocal8Bit();
                emit signalToolButtonChanged(strname);
            }
        }
    }
    
    

    效果:

     

    public:
        QMyWidget(QWidget *parent = Q_NULLPTR);
    signals:
        void signalToolButtonChanged(std::string& strName);
    public slots:
        void OnSlotTool1(bool bChecked);
        void OnSlotTool2(bool bChecked);
        void OnSlotTool3(bool bChecked);
    };
  • 相关阅读:
    ubuntu18.04安装ssh服务
    跳转
    【WinForm】—窗体之间传值的几种方式
    使用jQuery完成复选框的全选和全不选
    VS2015下载安装随笔记录
    关于c#数据类型,类型转换,变量,常量,转义符。
    浅谈表单同步提交和异步提交
    form表单提交和跳转
    2019年8月19日矩阵
    C# WinForm快捷键设置技巧
  • 原文地址:https://www.cnblogs.com/chechen/p/15753472.html
Copyright © 2011-2022 走看看