从QFormLayout中创建的QSpinBox获取值

时间:2013-04-09 03:21:06

标签: c++ qt

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

创建的QSpinBox
     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设置为添加到QMainWindow的QDockWidget的窗口小部件。

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

很抱歉,如果我以不寻常的方式使用Qt,我是Qt编程的新手。另外,我不想使用任何可视化编程,我想编码所有内容。提前谢谢!

3 个答案:

答案 0 :(得分:5)

首先 - 创建小部件而不指定父级是潜在的内存泄漏,所以你不应该这样做,除非你确切知道你在做什么。

其次,如果你想在你的班级中使用一些价值 - 你应该把它指向你班级的一个成员,并按名称对其进行处理(如Aliceljm所做的那样)。

此外,您可以按顺序使用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();

答案 1 :(得分:0)

我认为你应该这样做:

    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值

答案 2 :(得分:0)

这是你的代码。

    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,然后是布局            找到确切的行和列然后你将到达spinbox          看它太复杂了,Qt很棒,它根本没有提供任何API来获取你在主窗口中添加的DockWidget(tabifiedDockWidgets API除外)。          所以这意味着,你必须改变实施逻辑,上面重播的答案是正确的。这是接近的方式,请注意,信号/槽的概念在另一个函数中访问spibox起着重要作用。* /

}

信号/插槽将用于解决此问题。 请使用以上代码发布的代码

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

你的位置。

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