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->button2
、ui->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 计算器中的连接更少的主要内容,如果未能解决你的问题,请参考以下文章