在C ++

时间:2018-09-19 12:41:47

标签: c++ syntax alias

我正在使用Qt框架为我的业务逻辑创建ui。 负责构建ui的类提供了几种方法,这些方法可以逐步地初始化ui元素,对其进行布局,对其进行分组,最后对它们进行格式化(即void MyUi::init3_formatUiElements())。

自然,某些ui元素需要设置大量的布局设置,因此此方法可能看起来像

void MyUi::init3_formatUiElements() {
    _spinBox_distance->setMinimum(0.0);
    _spinBox_distance->setMaximum(10.0);
    _spinBox_distance->setSingleStep(0.5);
    _spinBox_distance->setSuffix(" meters");
    //...

    //same for other widgets
    return;
}

QDoubleSpinBox* _spinBox_distance之类的对象是MyUi类的成员字段。

我想为_spinBox_distance提供一个“临时别名”,因为上述方法主体简化为

void MyUi::init3_formatUiElements() {
    //create alias x for _spinBox_distance here
    x->setMinimum(0.0);
    x->setMaximum(10.0);
    x->setSingleStep(0.5);
    x->setSuffix(" meters");
    //...
    //free alias x here

    //same for other widgets: create alias x for next widget
    //...
    //free alias x here

    return;
}

这将加快键入过程,并使代码片段更易于复制/粘贴,尤其是对于类似类型的ui元素。

除了在大括号中为每个块定义范围

{ QDoubleSpinBox*& x = _spinBox_distance;
x->setMinimum(0.0);
//...
}
{ QLabel*& x = _label_someOtherWidget;
//...
}

是否有一种优雅的方法来实现这一目标?

我尝试了上述语法而没有进行范围界定,但是破坏x无疑会导致底层小部件的破坏。

也许

QDoubleSpinBox** x = new QDoubleSpinBox*;
x = &_spinBox_distance;
(*x)->setMinimum(0.0);
//...
delete x;

但是,这并不会使类型更加容易(多了三行,指向指针的指针,(*x))...:D

编辑:此命令不能像delete x之后使用,无法重新声明为另一种类型。

3 个答案:

答案 0 :(得分:0)

使用宏怎么样?

 <form method="post" action="">
  <select id="select-box" name="amt_per">
    <option class="amt-button" value="1">1</option>
    <option class="amt-button" value="2">2</option>
    <option class="amt-button" value="3">3</option>
    <option class="amt-button" value="4">4</option>
  </select>
</form>

#define Set(argument) _spinBox_distance->set##argument

Set(Minimum(0.0));
Set(Maximum(10.0));
Set(SingleStep(0.5));
Set(Suffix(" meters"));

答案 1 :(得分:0)

从评论部分收集有关问题的基本概念性思想,我可以发布该问题的句法/技术答案。毫无疑问,不应在任何类型的“复杂”情况下(或者根本不要)选择这种方法。

  • 不良的编码风格:
    • 不同事物的名称相同
    • 没有告诉您有关该对象的任何信息的名称
  • 将重复的代码移至专用功能,这些功能...
    • 可能专门研究几种ui类型
    • 是模板功能
    • ...
  • 如果使用Qt,请使用Qt Designer。
  • ...

{ auto x = _spinBox_distance;
x->setMinimum(0.0);
//...
}
{ auto x = _label_someOtherWidget;
//...
}

可以解决问题。

答案 2 :(得分:0)

我认为您的代码看起来不错,我发现使代码易于阅读/理解比使代码易于编写更为有用。请记住,您只需编写一次代码,然后便必须多次阅读。
在这种情况下,我可以更轻松地复制和粘贴旧的(常常被指责为错误)的文字。抓住_spinBox_distance->set,然后粘贴,完成线条,粘贴,完成线条等...

但是,如果您发现自己一次又一次地写那4个setter,则将它们放到带有4个参数的1个函数中。

void SetParameters(QDoubleSpinBox* spinBox_distance, double min, double max, double step, std::string suffix)
{
    //the setters
}