从QFormLayout中创建的QSpinBox中获取值

getting value from QSpinBox created in a QFormLayout

本文关键字:获取 QSpinBox 创建 QFormLayout      更新时间:2023-10-16

我想知道如何引用我用代码

创建的QSpinBox s
     QFormLayout* layout = new QFormLayout;
     layout->addRow(new QLabel(tr("Board Size")), new QSpinBox);
     layout->addRow(new QLabel(tr("Number of nStarting Moves")), new QSpinBox);
     layout->addRow(new QLabel(tr("Seed Value")), new QSpinBox);

这是在一个void函数,创建一个窗体布局,将其应用到一个QWidget f,然后设置f作为一个QDockWidget的小部件,添加到一个QMainWindow。

然后,我需要使用QSpinBox s中的值来运行另一个函数,但我不知道如何区分或引用这些框。我知道QSpinBox有一个value()函数,但我如何在每个不同的盒子上调用它?

对不起,如果我使用Qt在一个不寻常的方式,我是新的Qt编程。此外,我不想使用任何可视化编程,我想编码一切。提前感谢!

首先,在没有指定父组件的情况下创建小部件是潜在的内存泄漏,所以你不应该这样做,除非你确切地知道你在做什么。

其次,如果你想在你的类中使用某个值——你应该把指向它的指针作为你的类的成员,并通过名字来指向它(就像alicejm所做的那样)。

另外,您可以按顺序使用void QFormLayout::addRow ( const QString & labelText, QWidget * field ),而不是手动创建标签(如果您不需要直接访问它们)。

综上所述,你的最终代码应该包含:

Widget.h

protected:
    QSpinBox *mBoardSizeSpinBox;
    QSpinBox *mNumberOfMovesSpinBox;
    QSpinBox *mSpeedValueSpinBox;

Widget.cpp

mBoardSizeSpinBox = new QSpinBox(this);
mNumberOfMovesSpinBox = new QSpinBox(this);
mSpeedValueSpinBox = new QSpinBox(this);
QFormLayout* layout = new QFormLayout(this);
layout->addRow(tr("Board Size"), mBoardSizeSpinBox);
layout->addRow(tr("Number of nStarting Moves"), mNumberOfMovesSpinBox);
layout->addRow(tr("Seed Value"), mSpeedValueSpinBox);
// ... using
int speedValue = mSpeedValueSpinBox->value();

我认为你应该这样做:

    QSpinBox *spinbox1=new QSpinBox;
spinbox1->setRange(1,100);
QSpinBox *spinbox2=new QSpinBox;
QSpinBox *spinbox3=new QSpinBox;
QFormLayout* layout = new QFormLayout;
layout->addRow(new QLabel(tr("Board Size")), spinbox1);
layout->addRow(new QLabel(tr("Number of nStarting Moves")), spinbox2);
layout->addRow(new QLabel(tr("Seed Value")), spinbox3);
qDebug()<< spinbox1->value();

指针可以在任何地方获得spinbox值

这是你的代码。

    void Test::createForm()
{
QFormLayout* layout = new QFormLayout;
layout->addRow(new QLabel(tr("Board Size")), new QSpinBox);
layout->addRow(new QLabel(tr("Number of nStarting Moves")), new QSpinBox);
layout->addRow(new QLabel(tr("Seed Value")), new QSpinBox);
QDockWidget *dockWidget =  new QDockWidget();
QWidget* widget = new QWidget(  );
widget->setLayout( layout );
dockWidget->setWidget( widget );
dockWidget->show();
addDockWidget(  Qt::LeftDockWidgetArea, dockWidget );
}

这是你的另一个函数,在这里你想获得spinbox的引用。

void Test::referSpinBox()
{

/*要到达spinbox的引用,你必须首先获得dockwidget,然后是widget,然后是layout找到准确的行和列,然后你将到达旋转盒看到它太复杂了,Qt是伟大的,它根本没有提供任何API来获得你在主窗口中添加的DockWidget(除了tabifiedDockWidgets API)。所以这意味着,你必须改变实现逻辑,上面重播的答案是正确的。这就是方法,注意,信号/插槽的概念是在访问spibox中起重要作用的另一个功能。*/

}

Signal/slot将用于解决此问题。请使用上面的答案张贴在这个代码

QObject::connect( mBoardSizeSpinBox, SIGNAL(valueChanged ( int  )), this, SLOT(YourAnotherSlot( int    )));

你的槽。

void Test::YourAnotherSlot( int )
{
//can access here.
mBoardSizeSpinBox->value();
}