2016-12-26 8 views
1

Я пытаюсь изучить некоторые Qt-программирования (C++) и для всего, что связано с UI. Я пришел из C# с WPF/MVVM. Проблема в том, что у меня возникают проблемы с переключением процесса рассуждений за моими выборами.Переход от C#/WPF к C++/Qt: динамический генерация списка кнопок

Что я пытаюсь сделать, это связать список (или вектор или какой-либо ObservableCollection) объектов с списком кнопок, чтобы пользовательский интерфейс отображал кнопку для каждого элемента в списке.

Предположим, что у меня есть класс Customer (который в C# будет моей моделью) с 2 переменными (плюс методы get/set или «Свойства», поскольку они вызывается в C#): Имя и тип. Каждая кнопка отобразит соответствующее имя, и щелчок отправит тип методу, который обрабатывает вызов.

Теперь у меня нет доступа к машине с VS в эти дни, но в C# я бы сделал что-то вроде создания View и ViewModel (т. Е. Контроллера). В VM я создам ObservableCollection для клиентов, который вызывает событие RaisePropertyChanged, когда он изменен, и в представлении я создам элемент ItemsControl, привязанный к ObservableCollection, с помощью DataTemplate Button. Кнопка будет иметь свойство Content, привязанное к имени клиента и с помощью CommandParameter (т. Е. Параметр, присвоенный событием клика) самой модели или типа клиента, чтобы сделать разные варианты в зависимости от его значения. Таким образом, изменение ObservableCollection изменит количество отображаемых кнопок.

Теперь моя проблема: как сделать то же самое в Qt? Лучшее, что я придумал, чтобы создать вектор этого класса клиента и в течение цикла:

for (unsigned int i = 0; i < model_vector.size(); ++i) 
{ 
    QPushButton* btn = new QPushButton(this); 
    btn->setText(model_vector[i].Name); 
    ui->verticalLayout->addWidget(btn); 

    connect(btn, SIGNAL (released()),this, SLOT (handleButton(model_vector[i]))); 

    btn->show(); 
} 

Я бы поставил этот цикл в методе, который призван обновить model_vector, так что я бы очистить VerticalLayout и повторно добавьте все кнопки, которые содержатся в векторе на данный момент.

Во всяком случае, это не похоже на реальный подход к модели/виду (в том смысле, который я читал в документах Qt), но, возможно, я просто не понимаю, как работает Qt.

Является ли это правильным, или есть лучший способ?

Спасибо!

ответ

0

Ваш оригинальный подход звучит очень похоже на то, что вы сделали бы с пользовательским интерфейсом на основе QtQuick.

Модель предоставит данные, QtQuick ListView (или аналогичный) обеспечит общую возможность просмотра и посредничество между моделью и фактической визуализацией входа, называемой делегатами. Делегатом в этом случае будет кнопка.

+0

Спасибо за ответ. Возможно, это вопрос OT, но вы бы посоветовали мне начать изучение классического Qt или Qt быстро? Используется ли больше, чем другое? – Marco

+0

Хотя обе технологии широко используются, предпочтение отдается предпочтению в зависимости от варианта использования. Когда программа представляет собой классическое настольное приложение, управляемое мышью/клавиатурой, формы и диалоги и т. Д. С необходимостью чувствовать себя на целевой платформе, тогда выбор обычно - QtWidgets. Когда программа находится на устройстве на основе сенсорного экрана (мобильном или встроенном) или имеет потребности в эффектах (анимация, постепенное изменение/выключение и т. Д.) Или пользовательский интерфейс с высоким пользовательским интерфейсом (думаю, медиаплееры), тогда выбор более вероятен QtQuick. Я видел соответствующую другую комбинацию, но она не очень распространена –

+0

Отлично, спасибо за разъяснение! – Marco

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

  • Нет связанных вопросов^_^