Задать вопрос
  • Qt. Как передавать данные между формами?

    @Mercury13
    Программист на «си с крестами» и не только
    Вариантов много, в зависимости от того, форма модальная или нет, и нужно ли каким-то моделям передавать сообщение «обновись».

    Вариант 1.
    class AddItem : public QWidget
    {
    public:
      AddItem(QWidget* aParent, QList<Institution>& aInstitutions)
          : QWidget(aParent), institutions(aInstitutions) {}
    private:
      QList<Institution>& institutions;
    };


    Во втором варианте у нас модальная форма, но редактировать можно только копию (например, институции первой формы задействованы в какой-то модели, или нужны каскадные удаления, или что-то ещё).
    class AddItem : public QDialog
    {
    public:
      int exec(QList<Institution>& aInstitutions);
    private:
      QList<Institution> institutions;
    };
    
    int AddItem::exec(QList<Institution>& aInstitutions)
    {
      institutions = aInstitutions;
      int r = QDialog::exec();
      if (r) {
         aInstitutions = std::move(institutions);
      }
      return r;
    }


    И много-много других вариантов.
    Ответ написан
    Комментировать
  • Непонятка с сортировкой - почему random более плохой случай, чем decremental array?

    @Mercury13
    Программист на «си с крестами» и не только
    Для пузырька убывающий массив действительно худший возможный случай, и единственное, что могу предположить,— JIT и предсказание ветвлений на уровне процессора. Ради интереса перейди на устаревшую виртуальную машину — думаю, этот случай сразу же станет худшим.

    Для быстрой убывающий массив — один из лучших случаев, будет сделано ровно [n/2] обменов. Легко показать, что элементы в начале и конце массива, стоящие на своих местах, быстрая сортировка не сместит никогда. Так что первое, что сделает сортировка,— разобьёт на меньший (отсортированный) и больший (частично отсортированный как надо, частично — в обратном порядке). Ту часть, которая как надо, сортировка не тронет. А ту, которая наоборот — задействуем трансфинитную индукцию, и получаем, что ровно [n/2].
    Ответ написан
    Комментировать
  • Когда ооп быстрее процедурного?

    @Mercury13
    Программист на «си с крестами» и не только
    ООП рассчитано не на скорость исполнения, а на скорость разработки. Как, впрочем, и многие другие современные технологии разработки. Всё, что ООП делает, можно реализовать и без ООП, и даже эффективнее. Стоит ли — другой вопрос.

    Какую задачу конкретно решает ООП? Обуздать сложность разработки программ, собранных из взаимодействующих компонентов. Вот от этого и пляшем: если программа не модульная (например, какой-нибудь сложный научный расчёт), ООП мало поможет. Также ООП не поможет, если стандартная реализация ООП недостаточно эффективна по процессору или по памяти — например, в мою бытность JavaMe’шником ООП не жаловали, поскольку памяти много ел, типичный мобильник имел от 215 до 800 килобайт доступной памяти. Также плохо будет работать там, где нет взаимодействия (на типичном PHP, который выдал страничку и исчез).

    Что на PHP можно реализовать объектно?
    • Поддержку каких-то протоколов (БД, почта, какая-нибудь внешняя веб-служба наподобие VK API или Mandrill).
    • Что-нибудь из предметной отрасли, что меняет своё состояние — например, генерация картинок, звуков, архивов, PDF…
    • Может, сделаешь какой-нибудь генератор страниц, который сначала собирает каркас страницы, а затем, в зависимости от настроек и целевого устройства, обращивает его HTML-кодом.
    Ответ написан
    Комментировать
  • Qt как создать много окон внутри одного?

    @Mercury13
    Программист на «си с крестами» и не только
    Сам не работал с этим под Qt, но называется это «многодокументный интерфейс» и простейший пример тут.
    doc.qt.io/qt-5/qtwidgets-mainwindows-mdi-example.html

    Также можно погуглить «Qt MDI».
    Ответ написан
    1 комментарий
  • Векторная алгебра может ли полностью заменить тригонометрию?

    @Mercury13
    Программист на «си с крестами» и не только
    Скажу по-другому: в тех местах, где не нужны углы в явном виде, тригонометрия, скорее всего, излишня, и действительно вопрос очень часто можно решить средствами векторной алгебры. В большинстве задач геймдева и трёхмерной графики — так точно.

    Ну буду настолько категоричным, чтобы сказать «полностью». Была как-то задача: есть шарнирный четырёхугольник, по диагонали натянута пружина. Может ли эта конструкция (в первом приближении) сымитировать педаль сцепления автомобиля? А то даже у Logitech G27 педаль сцепления не слишком убедительная. Решал численно и тригонометрией, хотя можно аналитически и векторной алгеброй попробовать.

    ЗЫ. Основные аргументы против — простота и накопление погрешностей. Но и накопление иногда можно обойти, не прибегая к тригонометрии — например, использовать кватернионы вместо матриц поворота в 3D или нормировать вектор в 2D.
    Ответ написан
    Комментировать
  • Как на основе расстояния Левенштейна вывести промежуточные слова?

    @Mercury13
    Программист на «си с крестами» и не только
    Разумеется, будем считать, что слова не должны быть осмысленными (иначе это другая задача, где этот алгоритм, с одной стороны, тяжеловат, с другой — совсем не нужен). Если между словами «коза» и «волк» расстояние 3, то промежуточные слова — «коза → воза → вола → волк». Или, если не против, «коза → козк →колк → волк».

    Итак, перед нами типичный алгоритм динамического программирования. В алгоритме динамического программирования есть два этапа: обратный ход и прямой. Этот алгоритм страдает двумя недостатками, мешающими взять и написать прямой ход.
    1. Матрица сжата. Вместо матрицы (M+1)×(N+1) мы имеем два массива длины N+1, хранящие одну строчку и потихоньку перезаписываемые.
    2. Нет второй матрицы, которая указывает направление, куда идти. В нашем случае направления — это три действия над строкой: замена, вставка и удаление.
    ну и 3) В сокращённом варианте хватит двух массивов, обмениваемых местами. К делу отношения не имеет, просто вопросы умелого программирования. Кажется, перед нами Java и утечек памяти тут нет — тем лучше.

    С задачами 1 и 2 надо сделать три вещи.
    1. Массивы D1 и D2 превратить в единую матрицу (M+1)×(N+1).
    2. Добавить второй такой же. Элементы его — enum: удалить/вставить/заменить.
    3. Написать прямой ход. Мы находимся в точке (M, N); смотрим, куда идти. Заменить — идём туда-то, вставить — идём туда-то, удалить — идём туда-то. Ну и, разумеется, выполняем нашу операцию на строках и выводим, что получилось. Продолжаем путь, пока не попадём в (0, 0).
    Ответ написан
  • Почему возникает ошибка "Нет такого слота"?

    @Mercury13
    Программист на «си с крестами» и не только
    Иногда Qt Creator проглючивает и требуется полная перекомпиляция проекта.
    Почему-то не запустился MOC.
    Ответ написан
  • Картинка из картинок.Как сделать??

    @Mercury13
    Программист на «си с крестами» и не только
    Простейший вариант…
    1. Для каждой малой картинки выбрать «средний» цвет.
    2. Уменьшить исходное изображение до M×N px, и в каждый пиксель вместо сплошного цвета подставить ту картинку, которая больше всего подходит по цвету.

    Алгоритм можно совершенствовать — например, подставлять одну из 10 наиболее подходящих, а если в радиусе, скажем, 30 единиц есть куда больше 10 картинок — брать их все. А можно ещё использовать метод коррекции ошибок Флойда-Стейнберга (наиболее удачный метод при переводе картинок в N цветов)
    Ответ написан
    3 комментария
  • Как доказать выводимость формул в исчислении высказываний?

    @Mercury13
    Программист на «си с крестами» и не только
    Любая тождественно истинная формула выводима. Любая выводимая формула тождественно истинна.
    Первый курс университета.
    Так что — либо вывести из десятка аксиом, либо доказать тождественную истинность.
    Ответ написан
  • Зачем нужны матрицы в Direct3D?

    @Mercury13
    Программист на «си с крестами» и не только
    Начнём с того, что вектор имеет три координаты: x, y и z. Все повороты системы координат (x, y, z) → (x', y', z'), масштабирования и их комбинации можно записать в виде

    x' = a11·x + a12·y + a13·z
    y' = a21·x + a22·y + a23·z
    z' = a31·x + a32·y + a33·z

    А теперь прочитайте, что такое «умножить матрицу на вектор». Узнаёте? — матрицу {aij} размером 3×3 умножаем на вектор-столбец (x, y, z)T и получаем вектор-столбец (x', y', z')T. Здесь буква T — это операция «транспонировать матрицу», заменить строки столбцами, а столбцы — строками.

    А теперь сделаем финт ушами. Возьмём 4-векторы (r, s, t, d) и обозначим x=r/d, y = s/d, z = t/d (так называемые однородные координаты). Преобразование в однородные координаты неоднозначно: декартовы координаты (1, 2, 3) можно обозначить как четвёркой (1, 2, 3, 1), так и четвёркой (10, 20, 30, 10). Для чего нам однородные? Матрицы 4×4, работающие над однородными координатами, позволяют записать и такие преобразования, как «сдвинуть» или «центральная проекция». Например, «сдвинуть» записывается как

    r' = 1·r + shiftx·d
    s' = 1·s + shifty·d
    t' = 1·t + shiftz·d
    d' = d

    или, в терминах матриц
    [r']   ( 1 0 0 shiftx )   [r]
    [s'] = ( 0 1 0 shifty ) · [s]
    [t']   ( 0 0 1 shiftz )   [t]
    [d']   ( 0 0 0 1      )   [d]

    (тут я не поленился собрать тэгом code нечто похожее на вектор-столбец, так что знак транспонирования не нужен :)
    Ответ написан
    Комментировать
  • Как сложить Excel ячейки по месяцам?

    @Mercury13
    Программист на «си с крестами» и не только
    Сейчас к Excel’ю доступа нет — копайте в сторону функции СУММЕСЛИ.
    Ответ написан
  • Для чего нужна рантайм-библиотека?

    @Mercury13
    Программист на «си с крестами» и не только
    В рантайм-библиотеке хранятся стандартные функции языка программирования. И malloc/new тоже.

    P.S. Также хранятся внутренние функции для обслуживания точки входа (int main).
    Ответ написан
  • Как правильно уменьшать размер (габариты) png?

    @Mercury13
    Программист на «си с крестами» и не только
    Мой совет работает для всех форматов, и растровых, и векторных. При рендеринге вектора или уменьшении растра использовать правильную гамму монитора (2,2 для Windows, сейчас на неё, насколько мне известно, перешёл и Мак).

    Вот у нас два цвета: (0,5, 0,5, 0,5) и (1, 1, 1). Во сколько раз второй ярче первого? Вдвое? Нет, в 2^2,2 раза. Потому сильно размытая (размытая с гаммой 1) линия выходит тоньше не столь размытой.
    Ответ написан
  • QModelDelegate: почему в таблице и делегате разная точность и локаль?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Переопределяем QStyledItemDelegate. У него есть функция displayText, превращающая значение в текст. Можно её переопределить (то, что изначально, мне не слишком нравится, несколько миллионов уже 5,67e+6), но не в этом дело.

    QWidget* LineEditDelegate::createEditor(
            QWidget* parent,
            const QStyleOptionViewItem& option,
            const QModelIndex&) const
    {
        QLineEdit* edit = new QLineEdit(parent);
        edit->setLocale(option.locale);   // важно! — локаль потом потребуется
        return edit;
    }
    
    void LineEditDelegate::setEditorData(
            QWidget* editor,
            const QModelIndex & index) const
    {
        QLineEdit* currEdit = dynamic_cast(editor);
        QVariant var = index.model()->data(index);
        QString text = displayText(var, editor->locale());
        currEdit->setText(text);
    }
    Ответ написан
    Комментировать
  • Qt: как сделать, чтобы редактор в таблице вёл себя по-другому при нажатии Tab?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    QModelIndex EditableTable::moveCursor(
            CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
    {
        switch (cursorAction) {
        case QAbstractItemView::MoveNext:
        case QAbstractItemView::MovePrevious:
            return QModelIndex();
            break;
        default:
            return Super::moveCursor(cursorAction, modifiers);
        }
    }


    Чтобы протолкнуть такую функциональность в Qt Creator, использовать функцию «Promote To…»
    Ответ написан
    Комментировать
  • QTableView: можно ли обменять местами чередующиеся строки без делегатов?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Кажется, это невозможно. Но оказалось, что этим занимается не делегат, а модель данных. Расходы на неё я счёл приемлемыми, так что — нельзя.
    Ответ написан
    Комментировать
  • Как заставить компоненты на форме в Qt Designer обрабатывать клавиши?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Задачу я не решил, но на вопрос ответил.
    doc.qt.io/qt-4.8/eventsandfilters.html#event-filters
    Ответ написан
    Комментировать
  • Почему не советуют использовать технологии Borland?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Очень долгое время был устаревший компилятор C++. Насколько мне известно, в XE10, совсем недавно, решилось (не проверял). Слоупоки!
    2. А почему? Где-то с 2001 года Borland натурально начхал на Delphi. Delphi 7 долгое время был самым лучшим — пока не появился 2010. Новые владельцы восстанавливают упущенное, но не всё идёт как надо (XE4 реально глючнее XE2, буду ещё думать, что лучше держать под Win10, чтобы работало с тамошней средой .NET).
    3. Кажется, они поставили не на тот кроссплатформенный фреймворк. FireMonkey — имитация стандартных элементов управления. Медленно и глючно. А если ради чего-то решил выключить ClearType — вообще атас!
    4. Бесплатный WinForms отобрал немалую аудиторию у тех, кому надо быстренько написать программу только под Windows. Но это скорее аналог VCL, чем FireMonkey.
    5. Embarcadero — фактически единственные, кто поддерживает хороший Паскаль.
    Ответ написан
    Комментировать
  • Decorator реализующий интерфейс, а не конкретный класс, возможно ли?

    @Mercury13
    Программист на «си с крестами» и не только
    Так, проблему понял (извините, больной слегка, соображаю плохо).

    Перед нами явно ломаная абстракция: нам надо глубоко внедряться в объект. Тут одно из двух.
    1) Бить объект на два, Repository с create() и update(), и DataStorage с save(). Тогда прослойкой между этими объектами можно пристроить валидатор.
    2) Налаживать точку для подключения внешнего валидатора в save().

    P.S. Декоратор и должен реализовать интерфейс, однако набор возможностей, которые он может делать с этим интерфейсом, невелик.
    Ответ написан
    5 комментариев
  • Вызвать дочернюю форму в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    Как ни странно, создать форму один раз. А затем…
    Показать — Show.
    Спрятать — Hide.
    Сделать модальный запрос (остальные формы временно неуправляемы, из функции не выходим, пока окно не закроется) — ShowModal.
    Ответ написан