摆脱重复的代码?

时间:2016-02-19 06:49:44

标签: c++ qt

我有一长串经常重复的代码:

ui->someLabel1->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));
ui->someLabel2->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));

问题在于someLabel部分是该代码的每一行中唯一不同的部分。我如何设置一个功能来减少这长长的代码?

这是我尝试过的一个例子:

myClass.h:

protected:
  void clearLabel(QLabel* label);

myClass.cpp

void myClass::clearLabel(QLabel* label){
  ui->label->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));
}

的main.cpp

if (someFlag == 1){
  clearLabel(someLabel1);
  } else {
    clearLabel(someLabel2);
}

这回来时出现someLabel was not declared in this scope错误。

我是不是错了?我需要替换的那长串代码中唯一的部分是someLabel

5 个答案:

答案 0 :(得分:3)

在main.cpp中,您必须致电

clearLabel(ui->someLabel2);

ui->部分非常重要,否则你不能给现有的物品赋予功能。

答案 1 :(得分:2)

您需要在此处使用宏(最少推荐)或模板。

一个例子是:

#define CLEAR_LABEL(LABEL) ui->LABEL->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));

if (someFlag == 1){
  CLEAR_LABEL(someLabel1);
} else {
  CLEAR_LABEL(someLabel2);
}

如果您想坚持使用此功能(推荐),请执行以下修改:

void myClass::clearLabel(QLabel* label){
  label->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));
  // label instead of ui->label
}

...

if (someFlag == 1){
  clearLabel(ui->someLabel1);  // ui->somelabel1 instead of somelabel1
} else {
  clearLabel(ui->someLabel2);  // ui->somelabel2 instead of somelabel2
}

答案 2 :(得分:1)

假设您的ui类被称为Ui,那么您当前代码的修复将类似于

void myClass::clearLabel(QLabel* Ui::*label){
  (ui->*label)->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));
}

myclass.clearLabel(&Ui::someLabel1);
myclass.clearLabel(&Ui::someLabel2);

虽然很难建议使用指向成员的指针,但您应该重新考虑您的设计,并为可以执行统一操作的标签设置某种集合。

答案 3 :(得分:0)

如果您在应用程序中的每个QLabel上设置此样式表,则可以使用qApp->setStylesheet(QStringLiteral("QLabel{color: transparent;}"));

直接在应用程序上设置此样式表

如果有许多标签需要具有此样式,而不是全部,则可以在Qt Designer中的这些标签上设置动态属性。 在设计器中,选择QLabel并单击属性部分中的大绿色加号,然后选择"布尔值..."。 现在将名称设置为" transparent"并检查这个属性。

Qt Designer dynamic property

如果您将应用程序样式表设置为:

qApp->setStyleSheet("QLabel[transparent=true]{ color: transparent; }");

具有此属性的所有QLabels都应根据需要显示。

这样做的好处是,您不需要编写一行代码来以这种方式设置标签样式。

答案 4 :(得分:-1)

或者可以尝试将QLabel添加到QList<QLabel*>。这样的事情:

QList<QLabel*> mylist;

mylist << ui->label << ui->label_2 << ui->label_3;

for (int i=0;i<3;i++) {
    mylist.at(i)->setStyleSheet(QStringLiteral("QLabel{color: transparent;}"));
}