将字符串转换为小部件名称QT 5.6

时间:2016-04-20 22:28:30

标签: c++ qt dynamic-programming

我目前正在开发一个包含超过152个QPushButtons的Qt C ++程序。我希望程序要做的是在满足特定条件时重新着色特定的QPushButton(四种条件下我有四种颜色)。我有一些数组可以跟踪每个QPushButton的每个条件,但到目前为止,我唯一能够实现的工作是:

ui->locker100->setStyleSheet("background-color: rgb(75, 150, 255); border-color: rgb(50, 0, 128);");

其中locker100是特定的QPushButton。我想要做的是将QString与一个数组连接起来,得到QPushButton的名字。它看起来像这样:

bool key[152];
std::fill(key, key + 152, true);
Qstring widgetName = "locker";
int input = 100;

if (key[input] == true)
{
    ui->widgetName + input->setStyleSheet("background-color: rgb(75, 150, 255); border-color: rgb(50, 0, 128);");
}

但是连接会产生错误。任何反馈和具体代码将非常感谢。谢谢!

2 个答案:

答案 0 :(得分:2)

我看到你要做的是什么,但你不能通过简单地构造一个恰好是你分配了标识符的名称的字符串来创建标识符。结果仍然是一个QString,你试图在QString上调用方法setStyleSheet(),这个方法并不存在。这告诉我,您理解标识符,类型和对象通常可以使用一些清新。

我相信以下代码可以满足您的需求。

//Create a map of QPushButtons with a QString key.
QMap<QString, QPushButton*> buttonMap;

//As an example I create and add a QPushButton to the map
QPushButton * input100 = new QPushButton();
buttonMap.insert("input100", input100);

//Construct the key
QString button = "input100";

// In this map  .value(key) returns a QPushButton * so
// we can call what ever public functions a QPushButton
// supports like this:
buttonMap.value(button)->setStyleSheet(...);

答案 1 :(得分:1)

警告您必须使用预处理器:

#define GET_BUTTON(id) ui->locker##id

更好的答案:

  • 您在某处的标题中定义了152个按钮,例如QPushbutton *locker1;。不要那样做。
  • 使用常量值作为键,例如enum,将数据存储在QHash<SomeEnum, bool>中,将按钮存储在QHash<SomeEnum, QPushButton *>
  • 使用常量访问bool和按钮更灵活,更易破碎。它也省去了预处理器,这总是一个好主意。