2016-04-20 3 views
2

В настоящее время я работаю над программой Qt C++ с более чем 152 QPushButtons. То, что я хотел бы сделать программе, это перекрасить определенный QPushButton, когда выполняется конкретное условие (у меня четыре цвета для четырех условий). У меня есть массивы, которые отслеживают каждое условие для каждого QPushButton, но до сих пор единственным, что мне удалось получить работу заключаются в следующем:Преобразование строк в имена виджетов QT 5.6

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);"); 
} 

Однако конкатенация создает ошибки. Любая обратная связь и специальный код будут очень оценены. Благодаря!

+1

Поместите пари на карте, используя имя в качестве ключа. Тогда вы можете сделать что-то подобное. mymap [widgername] -> .... – Pemdas

+0

У меня возникли проблемы с попыткой увидеть код для этого. Не могли бы вы подробнее объяснить свой ответ? – Abraxas

+0

В качестве альтернативы, чтобы свести к минимуму ваши усилия: QString styleString = QString ("QPushButton # locker% 1 {background-color: rgb (75, 150, 255); border-color: rgb (50, 0, 128);}"). Arg (вход); этом-> setStyleSheet (styleString); – Devopia

ответ

2

Я вижу, что вы пытаетесь сделать, но вы не можете создавать идентификаторы, просто создавая строку, которая является именем, которым вы присвоили идентификатор. Результатом остается QString, и вы пытаетесь вызвать метод setStyleSheet() на QString, которого не существует. Это говорит мне, что ваши понимающие идентификаторы, типы и объекты в целом могли бы использовать некоторое освежение.

Я считаю, что следующий код делает то, что вы ищете.

//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(...); 
+0

Спасибо за объяснение Pemdas. Поэтому я скопировал код в новое приложение виджета QT, чтобы проверить его, убедившись, что есть QPushButton с именем input100 и что setStyleSheet (...) заполнен соответствующими значениями. В результате код был скомпилирован, но кнопка не меняла цвет. Но я думаю, что ты на правильном пути Пемдас. Пенни за свои мысли? – Abraxas

+0

Я думаю, что вы переполируете виджет, чтобы он забирал изменения свойств. – Pemdas

1

С предупреждением, что вам придется использовать препроцессор:

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

Лучший ответ:

  • Вы определяете 152 кнопки в заголовке где-нибудь, например, QPushbutton *locker1;. Не делай этого.
  • Используйте постоянные значения как ключи, например enum, сохраните свои данные в QHash<SomeEnum, bool> и кнопками в QHash<SomeEnum, QPushButton *>.
  • Использование констант для доступа к bool и кнопкам более гибкое и менее разрушаемое. Он также оставляет в стороне препроцессор, который всегда является хорошей идеей.
+0

Это будет работать. – Pemdas

+0

Это не плохая идея для хранения данных и кнопок. Я знаю, что QHash имеет некоторое сходство с QMap. Судя по коду, предоставленному мне pemdas, хотя, я думаю, что я все еще буду сталкиваться с тем же вопросом. Код компилируется, программа запускается, но кнопка не меняет цвет. Я что-то упускаю. – Abraxas

+0

Это другой вопрос. : -/Похоже, вам нужно унаследовать 'QPushButton' и переопределить' paintEvent'. –

Смежные вопросы