QT - слоты испускания вместо сигналов

Предположим, что у меня есть виджет QPushButton, который подключен к слоту его нажатым () сигнал. Этот первый слот в свою очередь называет другой слот испускать ключевым словом. Второй слот берет аргумент от первого слота, и сделайте что-то с ним. Это работало, но от того, что я понимаю шаблона слотов сигналов, только имеет смысл испускать сигнал. Разве неправильно испустить слот вместо сигнала?

6
задан Massimo Fazzolari 8 February 2010 в 11:43
поделиться

3 ответа

Попробуйте использовать form _ для вместо semantic _ form _ для и замените <% = form.input:allow_comments% > на <% = form.check_box_field:allow_comments% >

-121--4648433-

Если у вас слишком много классов, которые работают из класса Interface, убедитесь, что все они реализуют метод.

Затем, если ваш интерфейс изменяется (например,

       public Interface IAnimal
            {
                public void Talk();
                public void Eat();
            }

и затем вы добавляете другой метод

       public Interface IAnimal
            {
                public void Talk();
                public void Sleep();
                public void Eat();
            }

, вы можете убедиться, что все они реализуют метод Sleep (). если у вас есть слишком много классов, которые dervice от IAnimal Inteface, то вы должны реализовать Sleep () для всех из них. это поможет вам максимально легко расширить ваши производные классы

-121--2890434-

Если вы посмотрите на определение излучения, вы увидите, что оно пустое. испускание используется только для указания на то, что сигнал излучается на этой линии. Поэтому испускание слота не имеет смысла.

Слоты - это обычные функции, их можно вызвать явным образом.

9
ответ дан 8 December 2019 в 12:59
поделиться

Да. Слот - это функция. Вы можете просто вызвать слот, как любую другую функцию в C ++ doSlotAction (params); . Только сигналы должны следовать за ключевым словом emit .

6
ответ дан 8 December 2019 в 12:59
поделиться

Большинство больших O предполагает идеализированную машину с бесконечной памятью с равномерным временем доступа, без влияния других приложений и т.д. Особенно при превышении пороговых значений, таких как размер кэша, размер основной памяти (пейджинг в swapfile или из него) может оказывать значительное влияние на производительность. Итак, вы определяете, как алгоритм работает в реальном мире, а не идеализированной среде выполнения.

-121--3044084-

Единственная ситуация, когда вам может потребоваться двусторонняя синхронизация, заключается в том, что управление, используемое для визуализации коллекции виртуальных машин, не дает вам знать о намерении пользователя создать или удалить предмет. То есть элемент управления непосредственно связан с вашей коллекцией виртуальных машин, и ЕДИНСТВЕННЫЙ способ, которым вы знаете, что предмет был добавлен/удален, заключается в наблюдении за коллекцией виртуальных машин. Если это не так, можно реализовать один путь sync и добавить/удалить предметы непосредственно в коллекции модели.

EDIT: Возьмем, например, WPF DataGrid управление привязано к наблюдаемой коллекции ItemViewModels. Если его Свойство CanUserAddRows имеет значение true и пользователь начинает вводить пустая строка внизу, DataGrid будет использовать конструктор по умолчанию ItemViewModel для создания свободного предмета а затем добавит его в сбор. Индикация отсутствует от ГД, что он хочет добавить предмет коллекции.c Я не могу думать ни о каком другое управление, которое является сложным достаточно, чтобы иметь возможность добавлять предметы в коллекция сама по себе.
Наоборот сценарий, когда у вас есть ListView привязать к коллекции и команде который указывает на намерение пользователя добавить новый предмет - затем в обработчике команд вы просто добавляете новый предмет в DataModel и пусть односторонняя синхронизация делает остальное задание. В этом случае ListView не является возможность добавления в коллекцию представляет.

Что касается самого процесса синхронизации, посмотрите на проект Bindable LINQ - он может минимизировать количество кода и улучшить удобочитаемость. Например, код, опубликованный Томом, будет переводиться примерно так:

class ViewModel
{
  public Model Model;
  public ObservableCollection<FooView> Foos;
  public ViewModel()
  {
    Foos = from foo in Model.Foos.AsBindable()
           select new FooView(foo);
  }
}

EDIT 2: После использования B-LINQ в течение некоторого времени я должен сказать, что у вас могут быть проблемы с производительностью. Я использовал его, чтобы синхронизировать относительно большие коллекции (сотни элементов) коллекции с десятками добавляемых элементов и удалял каждую секунду, и я должен был бросить его и синхронизация орудия путем, Том предложил.
Я все еще использую B-LINQ, хотя в тех частях проекта, где коллекции небольшие и производительность не проблема.

-121--3926356-

Только для завершения предыдущих ответов сигналы являются действительно защищенными методами, реализуемыми moc, компилятором метаобъектов.

3
ответ дан 8 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: