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:来自多个旋转框的项目列表的主要内容,如果未能解决你的问题,请参考以下文章

旋转框列表,仅显示更改的值

来自两个抽象类的多重继承 (Qt)

来自数据框的嵌套字典,带有循环列表

多个熊猫数据框的交集

来自 2 列数据框的 Python 递归函数

在 Qt for Android 中包含多个源目录