Qt 计算器中的连接更少

Posted

技术标签:

【中文标题】Qt 计算器中的连接更少【英文标题】:Fewer connections in a Qt calculator 【发布时间】:2010-02-05 19:07:24 【问题描述】:

出于学习目的,我正在使用 Qt 和 C++ 编写一个简化的计算器。每个数字都是一个 QPushButton,它使用相同的插槽来修改用作显示的 lineEdit 小部件中的文本。

插槽使用 sender() 方法来确定按下了哪个按钮,因此正确的数字将被写入显示小部件。

为了让所有按钮都能正常工作,我必须为每个按钮编写一个连接,有点像这样:

connect(ui->button1, SIGNAL(clicked()), this, SLOT(writeNum()));

由于它们都使用相同的插槽,唯一改变的是正在使用的按钮,因此下一个发送者将是ui->button2ui->button3,等等。我的问题是,有没有办法减少定义的连接数?

编辑:Here 是一个有用的链接,详细讨论了这个问题。

【问题讨论】:

【参考方案1】:

如果您使用 QtDesigner 或 QtCreator 的表单编辑器,您只需在 2 之间拖动线条,它就会为您填写代码。

您也可以将所有按钮保留在列表结构中,但我会使用 QVector 而不是标准数组。

您可能还想重新考虑使用sender() 方法,它违反了OOP 设计。而是将所有按钮连接到 QSignalMapper,然后将 mapped() 连接到您的文本框。

【讨论】:

感谢 QSignalMapper 的提示,我觉得会有更好的方法。【参考方案2】:

在这种情况下,您应该使用 int 来识别向您的插槽发送信号的按钮。本质上,您使用 QSignalMapper 来完成该任务:

QSignalMapper sm;

QPushButton* one = new QPushButton(this);
QPushButton* two = new QPushButton(this);
QPushButton* three = new QPushButton(this);
//and so on...

sm.setMapping(one, 1);
sm.setMapping(two, 2);
sm.setMapping(three, 3);
//and so on...

connect(one,  SIGNAL(clicked()), &sm, SLOT(map()));
connect(two,  SIGNAL(clicked()), &sm, SLOT(map()));
connect(three,  SIGNAL(clicked()), &sm, SLOT(map()));
//and so on...



connect(&sm, SIGNAL(mapped(int)), this, SLOT(yourslothere(int)));

注意:QSignalMapper 非常有用,请记住这一点;)

【讨论】:

【参考方案3】:

我认为你可以尝试在数组中分配 QPushButton,像这样

QPushButton* numbers = new QPushButton[10];

然后,使用 for 循环执行连接

for(size_t i = 0; i < 9; ++i)

  connect(numbers[i],SIGNAL(clicked()),this,SLOT(writeNum()));

但我认为这不值得。显式连接,在使代码更冗长的同时,使连接对读者更清楚。

【讨论】:

问题实际上是为了减少连接,你​​只是重组它。我怀疑二进制会有什么不同(如果你启用基本优化)。 @soxs060389 是的。但是即使使用 QSignalMapper 之类的东西,连接的数量可能会保持不变,只是有一个额外的抽象层隐藏它。 你是对的,但是如果你创建了一个不错的类结构,则可以对用户隐藏 n-1 个连接

以上是关于Qt 计算器中的连接更少的主要内容,如果未能解决你的问题,请参考以下文章

使用qt制作一个简单的计算器

Qt5 - QML:如何正确连接 ProgressBar 和 Button 以进行长时间运行的循环计算

Qt简易计算器

使用VS2013+QT5.7.0开发简单计算器

Qt - 如何计算 .txt 文件中的行数

计算 MD5 哈希是不是比 SHA 系列函数占用更少的 CPU 资源?