单击旁边的按钮时如何引用动态创建的标签 [Qt]

2024-04-26

每次按下“添加客户端”按钮时,减号按钮、客户端名称、客户端计数器和加号按钮都会以水平线添加到网格布局中。我想在按下加号/减号按钮时更新计数(QLabel)。

这是我的代码:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QGridLayout>
#include <QLabel>

int row = 0;

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

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

void Widget::on_pushButton_clicked()
{
    QPushButton* minus_button = new QPushButton();
    QPushButton* plus_button = new QPushButton();
    minus_button->setText("-");
    plus_button->setText("+");

    QLabel* client_name = new QLabel(ui->lineEdit->text(), this);
    QLabel* client_count = new QLabel("", this);

    ui->gridLayout->addWidget(minus_button, row, 1, Qt::AlignTop|Qt::AlignHCenter);
    ui->gridLayout->addWidget(client_name, row, 2, Qt::AlignTop|Qt::AlignHCenter);
    ui->gridLayout->addWidget(client_count, row, 3, Qt::AlignTop|Qt::AlignHCenter);
    ui->gridLayout->addWidget(plus_button, row++, 4, Qt::AlignTop|Qt::AlignHCenter);

    connect(minus_button, SIGNAL(clicked(bool)), this, SLOT(minusCount()));
    connect(plus_button, SIGNAL(clicked(bool)), this, SLOT(plusCount()));
}

void Widget::minusCount(){
    //Here I want to somehow reference the client_count label which is in the same row
}
void Widget::plusCount(){
    //Here I want to somehow reference the client_count label which is in the same row
}

编辑:在凯文发表评论之后,这里是任何可能需要它的人的工作代码。

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QGridLayout>
#include <QLabel>
#include <QSignalMapper>

QSignalMapper* m_minusMapper;
QSignalMapper* m_plusMapper;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_minusMapper = new QSignalMapper(this);
    connect(m_minusMapper, SIGNAL(mapped(QWidget*)), this, SLOT(minusCount(QWidget*)));

    m_plusMapper = new QSignalMapper(this);
    connect(m_plusMapper, SIGNAL(mapped(QWidget*)), this, SLOT(plusCount(QWidget*)));
}

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

void Widget::on_pushButton_clicked()
{
    QPushButton* minus_button = new QPushButton();
    minus_button->setObjectName("minus" + QString::number(row));
    minus_button->setText("-");

    QPushButton* plus_button = new QPushButton();
    plus_button->setObjectName("plus" + QString::number(row));
    plus_button->setText("+");

    QLabel* client_name = new QLabel(ui->lineEdit->text(), this);
    QLabel* client_count = new QLabel("0", this);

    ui->gridLayout->addWidget(minus_button, row, 1, Qt::AlignVCenter|Qt::AlignHCenter);
    ui->gridLayout->addWidget(client_name, row, 2, Qt::AlignVCenter|Qt::AlignHCenter);
    ui->gridLayout->addWidget(client_count, row, 3, Qt::AlignVCenter|Qt::AlignHCenter);
    ui->gridLayout->addWidget(plus_button, row++, 4, Qt::AlignVCenter|Qt::AlignHCenter);

    connect(minus_button, SIGNAL(clicked()), m_minusMapper, SLOT(map()));
    connect(plus_button, SIGNAL(clicked()), m_plusMapper, SLOT(map()));

    m_minusMapper->setMapping(minus_button, client_count);
    m_plusMapper->setMapping(plus_button, client_count);
}

void Widget::minusCount(QWidget *widget)
{
    QLabel *client_count = qobject_cast<QLabel*>(widget);
    QString initCount = client_count->text();
    int newCount = initCount.toInt() - 1;
    client_count->setText(QString::number(newCount));
}

void Widget::plusCount(QWidget *widget)
{
    QLabel *client_count = qobject_cast<QLabel*>(widget);
    QString initCount = client_count->text();
    int newCount = initCount.toInt() + 1;
    client_count->setText(QString::number(newCount));
}

Kevin 的回答原则上很好,但由于我们现在已经到了 2016 年,MSVC2010、gcc 4.7 和 Clang 3.1(可能还有更早的版本)支持 lambdas/C++11,我想添加一个不带 QSignalMapper 的版本:

static void minusCount(QLabel *label)
{
    QString initCount = label->text();
    int newCount = initCount.toInt() - 1;
    label->setText(QString::number(newCount));
}

static void plusCount(QLabel *label)
{
    QString initCount = label->text();
    int newCount = initCount.toInt() + 1;
    label->setText(QString::number(newCount));
}

void Widget::on_pushButton_clicked()
{
    // ... add the labels and buttons, then:
    connect(minus_button, &QPushButton::clicked,
            client_count, [client_count]() { minusCount(client_count); });
    connect(plus_button, &QPushButton::clicked,
            client_count, [client_count]() { plusCount(client_count); });
}

这里的client_count按钮单击应更改的标签在 lambda 中捕获,并直接传递给处理它的函数。

The minusCount and plusCount也可以是静态函数,因为它们只对作为参数传递的标签进行操作,所以它们独立于任何Widget实例。

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

单击旁边的按钮时如何引用动态创建的标签 [Qt] 的相关文章

随机推荐

  • 如何在CSS中捏住一行的中间

    我正在尝试制作一条看起来几乎在末端有衬线的线条 本质上 我想让它在最末端变宽 在中间变细 只需使用 css 这实际上被证明是一个相当大的挑战 任何帮助 将不胜感激 到目前为止 我已经能够了解我想要如何使用 after伪选择器 但顶部没有运气
  • 如何使用shoulda匹配器来测试多态关联?

    我正在使用带有rails的shoulda matchers 并创建一个名为 comments 的模型和另一个名为 post 的模型 评论是多态的 当我在这样的帖子中使用 shoulda 匹配器进行测试时 it should have man
  • 导入错误:没有名为“编码”的模块

    我最近重新安装了ubuntu并升级到16 04并且无法使用python python manage py runserver Could not find platform independent libraries
  • 将 Azure CDN 与共享访问签名结合使用

    我正在尝试合并 Azure 来存储应用程序的大部分文件 我想将这些文件上传到 azure 中的私有容器和私有 blob 并通过 Azure CDN 将这些上传内容复制到所有其他节点 仍然作为私有容器和 blob 然后 我希望我的应用程序向存
  • “from Six.moves import urllib”在 Python 中做什么?

    我在 Python 代码中发现了以下行 from six moves import urllib 同时 我可以找到urllib py任何地方 我发现有一个文件six py在包根目录中 它有class Module six moves url
  • 在 R 中查找观察值之间的时间差

    我正在尝试确定两次观察之间的时间差 数据由不同的个人分解 每个人都有自己唯一的 ID 我有一个数据集 它告诉我每次状态发生变化时他们的状态会更新什么 以及他们的状态何时发生变化 状态可以是两个值之一 并且它总是更改为它不是的值 在本例中 从
  • C# 中的可选数组参数[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中传递一个空数组作为可选参数的默认值 https stackoverflow com questions 3480382 passing an empty array as default v
  • 比特币客户端如何确定第一个连接的IP地址?

    据我所知 比特币是一种 p2p 协议P2P协议必须有一个专用的中央服务器 https stackoverflow com questions 310607 peer to peer methods of finding peers 但据说比
  • 如何完善这个FTP(shell)功能?

    我有大量使用以下函数的脚本 Copies files over using FTP Configurations set at the beggining of the script param 1 FTP Host 2 FTP User
  • 如何在 swiftui 中使用 .quickLookPreview 修饰符

    我正在尝试使用视图修饰符 quickLookPreview在 iOS 14 macOS 11 macCatalyst 14 中引入 但我收到此错误Value of type some View has no member quickLook
  • 在 Firefox 上使用 popState 平滑滚动和返回按钮 - 需要单击两次

    我正在尝试实现一个小代码 当我单击锚点时 并且锚点名称出现在动画之后 我可以使用它实现平滑滚动 并且如果我按下浏览器的后退按钮 我想返回到页面顶部并更新 URL 不带 anchor 名称 这是代码 function Smooth scrol
  • 无法更新 Android Studio 中的 JDK 位置

    我无法在 Android Studio 中更新 Java JDK 或 Android SDK 路径 要更新默认的 JDK 或 Android SDK 打开Android Studio 转到快速启动 gt 配置 gt 项目默认值 gt 项目结
  • 画布绘制文本定位

    我正在创建一个绘图工具 用户可以在其中向图像添加文本 当通过画布位置将文本绘制到位图时 未正确设置 Paint paint new Paint paint setStyle Paint Style FILL paint setColor C
  • 如何使用没有按钮的 jQuery UI 图标?

    jQuery UI 带有一些很好的图标 没有按钮我该如何使用它们 让我们说一下如何创建链接plus签名并通过更改图标对悬停和单击做出反应 Here http jsfiddle net and7ey gZQzt 是仅添加图标的演示 Upd 1
  • python 遍历文件中的行

    我见过这两种处理文件的方法 file open file txt for line in file do something file open file txt contents file read for line in content
  • 无与伦比的括号宏怪异

    根据 C99 规则预处理以下 3 行的正确输出是什么 define y x x define x a y a x 1 x 2 顺便说一句 linux 下的 cpp 会产生错误消息 但我不明白为什么答案不简单 1 2 假设 cpp 是正确的而
  • 以编程方式自动填充 UAC 详细信息

    有没有办法通过编程方式在 Visa 中自动填写 UAC 登录名和密码 例如 出现UAC提示 您的程序会自动为您填写该信息 例如 一个程序会在 UAC 提示符中使用管理员用户名和密码自动填充该信息 SendKeys 无法将输入键发送到 UAC
  • 如何在 Inno Setup 中为控件卷出设置动画

    我想在我的安装程序中制作控件滚动的动画 你可以看这个视频 https drive google com file d 1H0HKTPXg9BdYD4HQWqCWHlGSTIHlcJa view 您可以使用计时器来为控件设置动画 Code f
  • 知道axios中是否有待处理的请求

    我是 ReactJS 的新手 对于我的 ajax 调用 我尝试使用Axios https github com mzabriskie axios图书馆 太棒了 但现在我想知道是否有办法知道 axios 拦截器中是否有待处理的请求 因为我想显
  • 单击旁边的按钮时如何引用动态创建的标签 [Qt]

    每次按下 添加客户端 按钮时 减号按钮 客户端名称 客户端计数器和加号按钮都会以水平线添加到网格布局中 我想在按下加号 减号按钮时更新计数 QLabel 这是我的代码 include widget h include ui widget h