QT:来自多个旋转框的项目列表
Posted
技术标签:
【中文标题】QT:来自多个旋转框的项目列表【英文标题】:QT: list of item from multiple spinboxes 【发布时间】:2016-07-05 19:10:40 【问题描述】:是否可以从每个 spinbox 中获取值列表并将它们放入列表中?
for (int i = 0; i < norm_size+1; i++)
getSpinleftValue(i);
我使用 for 循环来设置我的所有连接
.
void GuiTest::getSpinleftValue(int index)
QSpinBox* spinleft[norm_size+1] = ui->norm_spinBox_9,
ui->norm_spinBox_10,
ui->norm_spinBox_11,
ui->norm_spinBox_12,
ui->norm_spinBox_13,
ui->norm_spinBox_14,
ui->norm_spinBox_15,
ui->norm_spinBox_16;
QObject::connect(spinleft[index], SIGNAL(valueChanged(int)), this, SLOT(spinboxWrite(int, index)));
.
然后,一旦 for 循环建立连接,我想将它们的输出写入一个列表以供以后使用。
.
void GuiTest::spinboxWrite(int arg1, int index)
int norm_list[16];
qDebug() << arg1;
qDebug() << index;
在这种情况下,我使用了一些调试功能,以便查看它们是否正常工作。现在它看起来不起作用,因为我没有正确编写“连接”部分。
No such slot GuiTest::spinboxWrite(int, index) in
我知道另一种解决方案是创建一堆这样的
void GuiTest::on_norm_spinBox_9_valueChanged(int arg1)
//code here
但如果可以的话,我宁愿不要用其中的 16 个来污染我的整个文件!
【问题讨论】:
您可以对多个旋转框使用相同的功能。这应该让你减少到 2 个功能。 您没有展示如何将信号连接到插槽,但它应该类似于connect(spinbox1, valueChanged, guitest, on_norm_spinBox_valueChanged);
。
我使用QtCreator自带的gui设计器。它为我做到了。
在 gui 设计器中,您应该能够打开 .ui 文件,单击“Edit Signals/Slots”并将箭头从旋转框中拖到窗口,然后选择 valueChanged(int)
左边和右边的一些功能。您可以为多个旋转框选择右侧的相同功能。
我刚刚尝试了您的建议。但我不确定 "to the window" 指的是什么。
【参考方案1】:
信号 valueChanged(int)
和您的插槽 spinboxWrite(int, index)
(请注意,在您的情况下 index 甚至不是类型!)没有匹配的签名,因此 connect
将不起作用。来自docs:
传递给 SIGNAL() 宏的签名的参数不得少于传递给 SLOT() 宏的签名。
我认为解决您的问题的最简单方法是将来自所有旋转框的 valueChanged(int)
信号连接到同一个插槽并使用 sender
来获取已更改的旋转框,这是您将如何做那,在构造函数中:
GuiTest::GuiTest(QWidget* parent)/*do you initializations*/
//after setup ui, create your spin boxes. . .
//get list of all children spin boxes
//(you can replace that with a hard coded list if it is
//not applicable)
QList<QSpinBox*> spinBoxes= findChildren<QSpinBox*>();
//connect the signal from all spin boxes to the slot
QSpinBox* spinBox;
foreach(spinBox, spinBoxes)
connect(spinBox, SIGNAL(valueChanged(int)), this, SLOT(SpinBoxChanged(int)));
这是您的spinboxWrite
插槽的外观:
void GuiTest::SpinBoxChanged(int value)
QSpinBox* sp= qobject_cast<QSpinBox*>(sender());
//now sp is a pointer to the QSpinBox that emitted the valueChanged signal
//and value is its value after the change
//do whatever you want to do with them here. . .
【讨论】:
您似乎在我发布答案之前已经编辑了您的问题,如果此答案不适用于您的问题,我将删除它 谢谢你,迈克。让我试试看。我阅读了您的 cmets,它可能会起作用。 谢谢,迈克。我会将您标记为解决方案。这真的很聪明,在调试器中运行它之后,它似乎是我认为我需要的。 我应该恢复对我的问题所做的更改吗?所以你的答案是相关的? @tisaconundrum ,为编辑答案而道歉。这里不需要使用QSignalMapper
,这是一个更简单的答案。我不够警觉,抱歉。以上是关于QT:来自多个旋转框的项目列表的主要内容,如果未能解决你的问题,请参考以下文章