【问题标题】:Converting strings to widget names QT 5.6将字符串转换为小部件名称 QT 5.6
【发布时间】:2016-04-20 22:28:30
【问题描述】:

我目前正在开发一个包含超过 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);");
}

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

【问题讨论】:

  • 使用名称作为键将假发放入地图中。然后你可以做这样的事情。 mymap [widgername]->....
  • 我在查看代码时遇到了麻烦。您介意更详细地解释您的答案吗?
  • 或者,为了尽量减少你的工作量: QString styleString = QString("QPushButton#locker%1{background-color: rgb(75, 150, 255); border-color: rgb(50, 0, 128);}").arg(输入); this->setStyleSheet(styleString);
  • @Devopia 这真的很接近我想要实现的目标,而且非常容易实现!到目前为止,我唯一的疑虑是它似乎重置了我在表单上的所有其他样式。除此之外,这个概念就像一个魅力。而不是使用 int 虽然我只是将两个字符串加在一起。这是代码:QString input = "1"; QString styleString = QString("#locker"+input+"{背景颜色: rgb(0, 150, 255); 边框颜色: rgb(50, 0, 128);}"); this->setStyleSheet(styleString); 思考我在做什么来导致所有样式重置?
  • 我不希望代码做任何事情 "#locker" +input 是一个不完整的限定符。我不确定样式表是如何解释的。

标签: c++ qt dynamic-programming


【解决方案1】:

我知道您要做什么,但是您不能通过简单地构造一个恰好是您分配标识符的名称的字符串来创建标识符。结果仍然是一个 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(...);

【讨论】:

  • 感谢您的解释 Pemdas。所以我将代码复制到一个新的 QT 小部件应用程序中进行测试,确保有一个名为 input100 的 QPushButton 并且 setStyleSheet(...) 填充了正确的值。结果是编译的代码但是按钮没有改变颜色。但我认为你在正确的轨道上 Pemdas。一分钱你的想法?
  • 我认为您已经重新打磨了小部件,因为它可以接收属性更改。
【解决方案2】:

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

#define GET_BUTTON(id) ui-&gt;locker##id

更好的答案:

  • 您在某处的标题中定义了 152 个按钮,例如QPushbutton *locker1;。不要那样做。
  • 使用常量值作为键,例如enum,将数据存储在QHash&lt;SomeEnum, bool&gt;,将按钮存储在QHash&lt;SomeEnum, QPushButton *&gt;
  • 使用常量访问bools 和按钮更加灵活,不易损坏。它还省略了预处理器,这始终是一个好主意。

【讨论】:

  • 这对于存储数据和按钮来说是个不错的主意。我知道 QHash 与 QMap 有一些相似之处。不过,从 pemdas 给我的代码来看,我认为我仍然会遇到同样的问题。代码编译,程序运行,但按钮不改变颜色。我错过了一些东西。
  • 这是一个不同的问题。 :-/ 听起来你需要继承QPushButton 并重新实现paintEvent
  • 另外,您可以为按钮的状态设置图标,并为图标设置适当的颜色。它不会设置整个背景,但会将按钮状态传达给用户。使用@Pemdas 示例:buttonMap.value(button)-&gt;setIcon(iconForSomeState);.
  • 嗯,现在有了一个想法。我从未考虑过使用图像/图标来传达按钮的状态。我会试一试。如果可行,我将为像我这样在此类问题上苦苦挣扎的其他人发布一段工作代码和说明……也就是说,除非有人击败我,哈哈。我可以看到使用这种方法出现的一个可能问题是图标可能会掩盖按钮的标签。尽管如此,我宁愿解决这样的问题,而不是大声笑。感谢您的想法!
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 2015-04-02
  • 2015-07-26
  • 2012-02-22
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多