0

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

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

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

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

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

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

4

3 回答 3

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 非常有用,请记住这一点;)

于 2010-02-06T22:20:54.950 回答
2

If you use QtDesigner or the form editor of QtCreator you can just drag lines between the 2 and it will fill in the code for you.

You could also keep all the buttons in a list structure, but I would use a QVector not a standard array.

You might also want to reconsider using the sender() method, it violates OOP design. Instead connect all the buttons to a QSignalMapper and then connect mapped() to your text box.

于 2010-02-05T20:30:43.950 回答
1

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

QPushButton* numbers = new QPushButton[10];

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

for(size_t i = 0; i < 9; ++i)
{
  connect(numbers[i],SIGNAL(clicked()),this,SLOT(writeNum()));
}

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

于 2010-02-05T19:13:48.470 回答