QT - 如何将小部件放置在互斥的组中?

2024-02-04

我想做类似以下的事情:

example

但用单选按钮而不是复选框。在上图中,小部件被放置到可以启用/禁用的组中,但我希望一次只启用 1 个组(在示例中,A 组和 C 组都启用)。

我用上面的例子做了Q组框 http://doc.qt.io/qt-5/qtwidgets-widgets-groupbox-example.html,但据我所知,它只提供正常的复选框,而不提供单选按钮。


中出现的复选框QGroupBox不是一个QCheckBox,这只是一张图。所以一个可能的解决方案是创建一个类来管理QGroupBox检查过。

#include <QApplication>
#include <QGroupBox>
#include <QLineEdit>
#include <QRadioButton>
#include <QSlider>
#include <QVBoxLayout>

class ExclusiveManager: public QObject{
public:
    using QObject::QObject;
    void addGroupBox(QGroupBox *groupbox){
        if(groupbox){
            groupbox->blockSignals(true);
            groupbox->setChecked(m_groupboxs.isEmpty());
            groupbox->blockSignals(false);
            m_groupboxs << groupbox;
            connect(groupbox, &QGroupBox::toggled, this, &ExclusiveManager::onToggled);
        }
    }
private slots:
    void onToggled(bool on){
        QGroupBox *groupbox = qobject_cast<QGroupBox *>(sender());
        if(on){
            for(QGroupBox *g: m_groupboxs){
                if(g != groupbox && g->isChecked()){
                    g->blockSignals(true);
                    g->setChecked(false);
                    g->blockSignals(false);
                }
            }
        }
        else{
            groupbox->blockSignals(true);
            groupbox->setChecked(false);
            groupbox->blockSignals(false);
        }
    }
private:
    QList<QGroupBox *> m_groupboxs;
};

class Widget: public QWidget{
public:
    Widget(QWidget *parent=nullptr):QWidget(parent){
        setLayout(new QVBoxLayout);

        ExclusiveManager *manager = new ExclusiveManager(this);

        group_a = new QGroupBox("Group A");
        group_a->setCheckable(true);
        group_b = new QGroupBox("Group B");
        group_b->setCheckable(true);
        group_c = new QGroupBox("Group C");
        group_c->setCheckable(true);
        layout()->addWidget(group_a);
        layout()->addWidget(group_b);
        layout()->addWidget(group_c);

        manager->addGroupBox(group_a);
        manager->addGroupBox(group_b);
        manager->addGroupBox(group_c);

        QVBoxLayout *layA = new QVBoxLayout();
        layA->addWidget(new QLineEdit);
        group_a->setLayout(layA);

        QVBoxLayout *layB = new QVBoxLayout();
        layB->addWidget(new QRadioButton("Option 1"));
        layB->addWidget(new QRadioButton("Option 2"));
        group_b->setLayout(layB);

        QVBoxLayout *layC = new QVBoxLayout();
        layC->addWidget(new QSlider(Qt::Horizontal));
        group_c->setLayout(layC);
    }
private:
    QGroupBox *group_a;
    QGroupBox *group_b;
    QGroupBox *group_c;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT - 如何将小部件放置在互斥的组中? 的相关文章

随机推荐

  • 有没有快速的算法来删除字符串中的重复子串?

    有一个类似的字符串 dxabcabcyyyydxycxcxz 我想将它合并到 dxabcydxycxz 其他例子 ddxddx gt dxdx abbab gt abab 规则是 if adjacent and same merge Suc
  • 从 StringIO 读取直到遇到某个字节的快速方法

    假设我有一些StringIO from cStringIO 我想从中读取缓冲区 直到遇到某个字符 字节 例如 Z 所以 stringio StringIO ABCZ123 buf read until stringio Z buf is n
  • 使用 REST API 持久化实体

    对于 Symfony2 中的项目 我需要能够使用外部 RESTful API 而不是数据库来保存 检索实体 由于 Doctrine 将实体映射到数据库表的一行 因此我认为创建从实体到外部 API 的映射也应该很容易 然而 这对我来说是新的
  • 如何从公会的每个成员中删除角色

    如何从服务器内的每个用户中删除角色 我尝试使用let everyone message guild members get and let everyone message guild members但他们都没有工作 这是整个代码 cons
  • TBB 可能存在内存泄漏

    测试程序 include
  • height=100% 不起作用

    下面的代码都是height 100 在chrome中工作正常 但在firefox和ie 7中显示很奇怪 这不完全是100 高度 有人知道吗 太感谢了
  • 从 iOS 7 Beta 测试者那里获取 UDID

    我正在通过无线方式向 Beta 测试人员部署应用程序的测试版本 在 iOS 7 之前 我可以通过让他们安装 UDID Pro 之类的应用程序并将其通过电子邮件发送给我来获取他们的 UDID 如果 Beta 测试人员使用 iOS 7 我如何从
  • 在 AlloyUI Scheduler 中保存、编辑、删除和取消事件

    如何从 AlloyUI 的 Scheduler 监听 保存 编辑 删除 和 取消 事件 我需要将值保存在数据库中以供将来使用 但我没有看到任何相关文档 我当前的代码是这样的 YUI use aui scheduler function Y
  • Android 中的 Kotlin 与地图

    override fun onCreateView inflater LayoutInflater container ViewGroup savedInstanceState Bundle View var view View infla
  • SessionNotCreatedException:消息:会话未创建:此版本的 ChromeDriver 仅支持使用 Selenium ChromeDriver v81 的 Chrome 版本 81

    我从 selenium 和 os 导入了 webdriver 我希望能够成功运行这段代码 driver webdriver Chrome executable path os path abspath chromedriver 我收到的错误
  • Spacy 更新 msvc 未找到

    我尝试将 spacy 从版本 2 0 18 更新到版本 2 1 1 但每次我尝试运行命令时 pip install spacy nightly or pip install U spacy 2 1 1 我刚刚得到 error WinErro
  • Python + MongoDB - 游标迭代太慢

    我实际上正在从事一个搜索引擎项目 我们正在使用 python mongoDb 对 mongo 数据库执行 find 命令后 我有一个 pymongo 光标 pymongo 游标有大约 20k 个结果 我注意到 与对相同大小的列表的正常迭代相
  • 没有同行证书。不确定该走哪条路线

    我正在尝试使用我的应用程序访问 https 网址 我已经关注了本教程 http blog crazybob org 2010 02 01 archive html 我创建的商店具有正确的 CA 但是 当我尝试建立连接时 出现以下错误 ERR
  • 如何在C#中声明会话变量? [复制]

    这个问题在这里已经有答案了 我想创建一个新会话 在文本框中输入的任何内容都会保存在该会话中 然后在另一个 aspx 页面上 我想在标签中显示该会话 我只是不确定如何开始 以及把所有东西放在哪里 我知道我需要 protected void P
  • 如何在图(.pb)中重新训练模型?

    我已将模型保存在图表 pb 文件 中 但现在这个模型不准确 我想开发它 我有其他数据的图片需要学习 但我不知道是否可能或如何做到这一点 结果必须是新数据pb图的修改 这是一个好问题 实际上 如果有人能解释如何做到这一点 那就太好了 但除此之
  • WordPress:自动更改帖子中的特定 URL

    我找到了一个解决方案来更改我的 WordPress 主题中的链接 但不能更改内容中的链接 如何获取内容中的 URL 以便我也可以更改它们 我需要使用the content筛选 但是如何才能更改像 apple com test apple c
  • Nifi 处理器无法正确解析 JSON

    我正在使用 EvaluateJsonPath 从 JSON 中提取一个特定值 我正在使用以下 JSONPath 表达式 data containerType SOURCE path SOURCE KYLO DATALAKE id 这是我调用
  • 有没有一种方法或工具可以自动访问我网站的所有页面

    我想自动访问 抓取我网站上的所有页面以生成缓存文件 有什么方法或工具可以做到这一点吗 只需使用下载整个页面的任何机器人即可 https superuser com questions 14403 how can i download an
  • 当我使用 Xcode 7.1 模拟器时,它们不断冻结

    最近 今天和昨天 我的模拟器每次打开时都开始冻结 我将启动我的应用程序 不到一分钟 甚至更短的时间 整个模拟器就会冻结 我就会陷入死亡之轮 如果我等待 它会解冻并执行任务 但几秒钟后又会冻结 如果我重新启动计算机 它会在冻结之前工作大约 5
  • QT - 如何将小部件放置在互斥的组中?

    我想做类似以下的事情 example 但用单选按钮而不是复选框 在上图中 小部件被放置到可以启用 禁用的组中 但我希望一次只启用 1 个组 在示例中 A 组和 C 组都启用 我用上面的例子做了Q组框 http doc qt io qt 5