Реклама
  • EVILEG
  • Статья
  • 16 января 2018 г. 7:19

Django - Урок 032. Расширенные параметры поиска

Django, Search

На сайте присутствует функционал, благодаря которому можно задать вопрос на форуме с указанием статьи на сайте, к которой так или иначе относится данный вопрос. Это делается благодаря внешним ключам от темы на форуме сайта к статьям. При этом внешнего ключа может и не быть.

article = models.ForeignKey(Article, verbose_name=_("Статья"), null=True, blank=True)

Таким образом в конце статьи можно увидеть, сколько вопросов на форуме задано по этой статье. Это позволяет улучшить перелинковку страниц сайта, а также предоставляет пользователям возможность найти похожие вопросы относительно статьи, которую они изучают.

Главным вопросом для меня было, как реализовать список тем на форуме так, чтобы не перегружать сайт дополнительными страницами, которые бы усложнили навигацию. Решение оказалось достаточно простым: добавить возможность поиска на форуме с дополнительными расширенными ключами поиска. А именно ключ article , который определял бы id статьи, по которому нужно отфильтровать все темы на форуме, которые содержат внешний ключ на статью с данным id .

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

  • MinusNull
  • Статья
  • 15 января 2018 г. 10:18

Шаблон программирования Pimpl - то, что вам следует знать

C++, Pimpl

Основы

Вы можете встретить шаблон Pimpl под другими именами: d-pointer, compiler firewall или даже шаблон Cheshire Cat или непрозрачный указатель.

В его основной форме шаблон выглядит следующим образом:

  • В классе мы перемещаем все закрытые члены в новый объявленный тип, например, в класс PrivateImpl .
  • Объявляем PrivateImpl в заголовочном файле основного класса.
  • В соответствующем файле cpp объявляем класс PrivateImpl и определяем его.
  • Теперь, если вы измените закрытую реализацию, код клиента не будет перекомпилирован (поскольку интерфейс не изменился).

Таким образом, это может выглядеть так (грубый, старый стиль кода!):

class.h

class MyClassImpl;
class MyClass {
    // ...
    void Foo();
private:    
    MyClassImpl* m_pImpl; // Предупреждение!!! 
                          // raw-указатель! :)
};

class.cpp

class MyClassImpl
{
public:
    void DoStuff() { /*...*/ }
};

MyClass::MyClass () 
: m_pImpl(new MyClassImpl()) 
{ }

MyClass::~MyClass () { delete m_pImpl; }

void MyClass ::DoSth() {
    m_pImpl->DoSth();
}

Эх ... уродливые raw-указатели!

Итак, кратко: мы упаковываем все, что является закрытым, в этот объявленный наперед класс. Мы используем только один член нашего основного класса - компилятор может работать только с указателем без полного объявления типа, поскольку необходим только размер указателя. Затем объявление и реализация происходят в файле .cpp .

Конечно, в современном C ++ рекомендуется использовать unique_ptr , а не raw-указатели.

Два очевидных недостатка этого подхода: нам нужно выделение памяти для хранения закрытой секции. А также основной класс просто перенаправляет вызов метода на закрытую реализацию.

Хорошо ... но это все ... верно? Не так просто!

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

  • EVILEG
  • Статья
  • 8 января 2018 г. 7:52

Django - Урок 031. Смена URL без перезагрузки страницы с частичной подгрузкой контента

Django, URL, JavaScript

Чем меньше информации приходится передавать сайту на каждый запрос, тем лучше. Поскольку получаем меньшую нагрузку на сервер и на канал связи. Первым таким улучшением на сайте я сделал подгрузку списка статей при навигации по пагинатору страниц.

Смысл в том, что когда пользователь хочет перейти на следующую страницу со списком статей и кликает на ссылку в пагинаторе , то производится перехват события клика, событие отменяется, но высылается AJAX запрос на сервер с номером запрашиваемой страницы. Когда сервер получает такой запрос, он производит рендеринг только списка статей и высылает его обратно.

  • HelgeID
  • Вопрос
  • 24 декабря 2017 г. 22:08

Сборка финального проекта Qt/QML

Привет ребята! У меня такая проблема: хочу собрать проект на Qt/QML.
Вот например имею такой код:
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
main.qml
import QtQuick 2.5
import QtQuick.Controls 1.0

ApplicationWindow {
    id: root

    visible: true
    width: 500
    height: 300
    title: "QtWindow"

    Button {
        anchors.centerIn: parent
        text: "Push me"
        onClicked: root.color = "blue"
    }
}
MyQtQuick.pro
TEMPLATE = app
QT += qml quick
CONFIG += c++11
SOURCES += main.cpp
RESOURCES += qml.qrc
QML_IMPORT_PATH =
QML_DESIGNER_IMPORT_PATH =
DEFINES += QT_DEPRECATED_WARNINGS

qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

Суть проблемы в том, что хочу запустить без редактора или не в среде Qt (отдельно).
Оно хочет библиотек! Ну лады начал вытаскивать по одной:
Вот список (сразу для релиза):
Qt5Core.dll, Qt5Gui.dll, Qt5Network.dll, Qt5Qml.dll, libgcc_s_dw2-1.dll, libwinpthread-1.dll
и все больше ничего не требует. Приложение не работает так как надо. В диспетчере задач запускается процесс и сразу завершился! Ошибки никакой нет! Ну и как здесь быть? Это одна проблема!

Второе: Думаю, может сделать статическую линковку. Ну хорошо! Сделал все по статье: https://vladsol.tk/2017/05/qt-5-8-0-static-build/ ,  делало 12 часов :)

Потом в настройках(сборка и запуск) добавил профиль, комплекты и тд.
Ну вроде работает, но только на моем компьютере. Если перенести на другой компьютер, или виртуальную машину, то выскакивает ошибка приложения
(при этом ничего не требует).
Как решить такую задачу?

Вот некоторая инфа:
os : win7 SP1 32bit
компилятор : MinGW 32bit
ver Qt : 5.9.1
проект : qml quick

Идиома "стирания типа" на примере QWidget

Type erasure idiom

Статья предполагает наличие у читателя базовых знаний C++

Реклама
  • falcon
  • 16 января 2018 г. 17:25

Qt - Тест 001. Сигналы и слоты

  • Результат 100 баллов
  • Очки рейтинга 10
  • falcon
  • 16 января 2018 г. 17:22

Qt - Тест 001. Сигналы и слоты

  • Результат 68 баллов
  • Очки рейтинга -1
  • falcon
  • 16 января 2018 г. 17:18

C++ - Тест 001. Первая программа и типы данных

  • Результат 73 баллов
  • Очки рейтинга 1
Последние комментарии

QML - Урок 021. Переключение между окнами в QML

Спасибо всем. Все получилось. Прикручиваю логику.

  • BlinCT
  • 14 января 2018 г. 19:28

Разработка на Qt под iOS

Вот честно, на сколько же муторно под огрызок что то делать. Куча проблем) А вод линь или под Андроид все просто и тривиально))

  • folax
  • 12 января 2018 г. 9:16

QML - Урок 021. Переключение между окнами в QML

Ничего сложного, делаете по тех заданию 3 файла qml, называете их как указанно в тех задании, потом из первого окна через Loader их переключаете, в окне 2 и 3 делаете сигналы которые при закры...

QML - Урок 021. Переключение между окнами в QML

Все верно, я и не говорил что этот кусок кода лично мое произведение. Это тоже верно: Это задание для прохождения на собеседование в одну из крупных украинских IT компаний. Логику ...

  • folax
  • 12 января 2018 г. 8:13

QML - Урок 021. Переключение между окнами в QML

int main(int argc, char *argv[]){ QApplication app(argc, argv); Logic logic; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("logic", &logic)...

Сейчас обсуждают на форуме

ChartView. Отображение метки данных точки серии при наведении курсора

Спасибо большущее за советы! Все получилось через ScatterSeries. Методы remove() как-то сходу не дались, удаляет в первый раз, а потом программа падает... Не стал тратить время и воспользовалс...

  • EVILEG
  • 16 января 2018 г. 14:23

Как проверить доступность сервера

Добрый день! Теоретически можно использовать QTcpSocket, у него есть метод connectToHost. Возможно, что проверка доступности через этот класс будет осуществляться несколько быстрее,...

QGraphicsScene

спасибо, за подробное объяснение строчки, а с зумом я разобрался, все работает

  • EVILEG
  • 15 января 2018 г. 17:21

Qt webgl

Насчёт проверки подключения клиента я не в курсе. Что касается экземпляров приложения, то из того, что я читал получается, что нет необходимости в нескольких экземплярах для нескольких кл...

  • EVILEG
  • 15 января 2018 г. 11:39

Проблема добавления #DEFINE при сборке CMak'ом

А Вы не пробовали сделать предкомпилированные библиотеки boost под свою систему, а потом уже подключать собранные библиотеки Boost`а? Просто один только boost может собираться на пару гиг...