我有一长串经常重复的代码:
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
。
答案 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"并检查这个属性。
如果您将应用程序样式表设置为:
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;}"));
}