2013-04-09 58 views
1

我不知道如何来指代QSpinBox的I与代码获得价值在QFormLayout创建

 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 s有一个value()函数,但是我怎样在每个不同的盒子上调用它?

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

回答

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(); 
+2

将小部件添加到布局将设置父母 – 2013-04-09 08:34:43

+0

是的,我记得有一段时间读它。但是,在写这个答案时,我翻看了Qt的帮助,并没有找到这个信息。无论如何,我真的相信,在一个好的代码中,你应该指定'QObject'继承者的父代(除非你真的*不需要你的对象拥有父代)。 – Amartel 2013-04-09 08:45:14

+0

它是这样的:http://qt-project.org/doc/qt-4.8/qlayout.html#addItem – 2013-04-09 08:47:26

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(); 

指针可以得到无处不在纺纱器值

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() 

{ 

/*达到纺纱器的参考,你必须首先得到dockwidget,那么窗口小部件,然后布局则 找到确切的行和科拉姆那么你将达成纺纱器 看到它过于复杂,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(); 
}