2

我想知道如何引用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为添加到 QMainWindow 的 QDockWidget 的小部件。

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

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

4

3 回答 3

6

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

其次,如果你想在你的类中使用一些值——你应该让一个指向它的指针成为你的类的成员并按名称寻址它(就像Aliceljm所做的那样)。

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

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

小部件.h

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

小部件.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();
于 2013-04-09T04:18:36.097 回答
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 值

于 2013-04-09T03:44:20.763 回答
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,然后是layout,然后找到精确的行和列,然后你就会到达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();
}
于 2013-04-09T06:22:06.193 回答