Реклама
  • EVILEG
  • Ответ
  • 16 января 2018 г. 14:23

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

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

Возможно, что проверка доступности через этот класс будет осуществляться несколько быстрее, чем через QNetworkAccessManager.
  • alex_lip
  • Вопрос
  • 16 января 2018 г. 6:55

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

IP сервера с которым я работаю может выглядеть по разному в зависимости от того внутри сети я нахожусь или во вне. Соответственно когда я запускаю программу - мне нужно понять по какому адресу доступен сервер по внешнему или по внутреннему(или вообще не доступен).  Сейчас я вот так подключаюсь к серверу

url_sea_text = server_ip_loc+"search/sea_text/"+poisk_txt+"/"+user_id;

networkManager_sea_text = new QNetworkAccessManager();
 QNetworkReply *replay_sea_text =  networkManager_sea_text->get(QNetworkRequest(QUrl(url_sea_text)));

    connect(networkManager_sea_text, &QNetworkAccessManager::finished, this, &AppCore::onResult_sea_text);

    connect(replay_sea_text, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(updateDownloadProgress(qint64,qint64)));

NetworkAccessManager работает асинхронно. И чтобы сильно долго не ждать надо каким-то образом по таймеру проверить, что ответа нет и пробовать другой адрес. Насколько я понимаю мне в процедуру

void AppCore::updateDownloadProgress(qint64 bytesRead, qint64 totalBytes)
{

   QTextStream cout(stdout);
   cout << QString::number(bytesRead) +"/"+QString::number(totalBytes) << endl;
   qDebug() <<"count"<< count;

   if (totalBytes>0) {
    count=bytesRead/totalBytes;
   }
   if (count>0.2) {
    emit sendToQml(count);
   }
}
Добавить проверку по таймеру, который нужно запустить в момент создания коннекта. И если на заданный тайм-аут
bytesRead =0 
то делать replay_sea_text.abort()  ?
У Вас есть урок по ping - но как мне кажется в этом случае пинг не достаточен. И он не кросс - платформен.


  • 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
  • Ответ
  • 15 января 2018 г. 8:14

qml градиентная прозрачность

Во-первых: Здравствуйте!

Во-вторых: Что это за требовательная постановка вопроса? Будто Вы заказчик, который поставил ТЗ. Здесь форум, а не стол заказов.

А теперь по существу вопроса. Решается следующим способом.
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0 // Подключить для работы с типом объекта LinearGradient 

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    color: "red"

    Item {
        width: 300
        height: 300

        LinearGradient {
            anchors.fill: parent
            start: Qt.point(0, 0) // Стартовая точка градиента
            end: Qt.point(0, 300) // конечная точка градиента
            gradient: Gradient {
                GradientStop { position: 1.0; color: "#00000000" }
                GradientStop { position: 0.0; color: "#FF000000" }
            }
        }
    }
}
Прозрачность определяется Альфа каналом. В данном случае FF в начале кода цвета означает полную непрозрачность, а 00 означает полностью прозрачный цвет.
  • BlinCT
  • Ответ
  • 15 января 2018 г. 7:28

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

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

cmake_minimum_required(VERSION 3.5.1)
project(Gener095) include_directories(../../088/SharedCode) add_definitions(-DGENER095_LIBRARY -DFRIEND_CLASS=Gener095_TestClass) add_definitions(-DLIB_NAME=\"${PROJECT_NAME}\") set(VERSION_TARGET "0.1.0") set(SOURCE_FILES Messages/message_095_data.cpp Messages/message_095_data.h gener095_core.cpp gener095_core.h gener095_global.cpp gener095_global.h taremanager.cpp taremanager.h ) qt5_add_resources(RCC_RESOURCES gener095_resources.qrc) project_generate_version("${VERSION_TARGET}" "lib") add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${RCC_RESOURCES}) target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Xml) target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Gui) target_link_libraries(${PROJECT_NAME} PUBLIC SharedCode) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../088) link_directories(${CMAKE_BINARY_DIR}/088/build-libs/SharedCode)
  • alex_lip
  • Статья
  • 14 января 2018 г. 19:15

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

ios, qt

Преамбула

Самая демократическая страна в мире создала самую тоталитарную операционную систему. Поэтому если вы хотите тестировать ваше ПО на IPad или IPhone вам нужно обязательно зарегистрироваться на сайте https://developer.apple.com/ в качестве разработчика. На первом этапе денег платить не обязательно. Добрый дядя Джобс даст вам сертификат, на использование для тестирования вашего же устройства, сроком на 7(семь) дней. По окончании действия сертификата ваше ПО не будет запускаться и его надо будет снова закачать с компа. Если вы захотите установить ваше ПО на устройство другого человека – его apple ID нужно будет точно так же прописать в Xcode как и ваш.

  • EVILEG
  • Ответ
  • 13 января 2018 г. 15:53

Qt webgl

А какое именно приложение пытались запустить?
Дело в том, что там не все приложения запускаются нормально, если говорить о примерах Qt, приложения на виджетах можно и не пытаться запускать.
QML приложения лучше писать на последних версиях QML, тогда с запуском всё гораздо лучше будет. То есть та же самая версия Qt 5.10.

  • Maxim
  • Вопрос
  • 13 января 2018 г. 8:42

Qt webgl

WebGL, Qt

Как запустить приложение с использованием webgl?

  • EVILEG
  • Ответ
  • 12 января 2018 г. 13:57

QDesktopServices::openUrl не работает под IOS

Всё отлично!
Единственное, только Qt вместо QT.
На сайте в правом верхнем углу есть ссылка "Написать статью", там будет редактор, создадите статью, перенесите текст туда, и нажмите Опубликовать. После публикации будет первичная модерация, на которой я поправлю огрехи вёрстки, если такие будут и подготовлю финальную версию.
Хорошо пишите, с душой ))))

  • 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);
    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));

    return app.exec();
}

Добрый день, этот код не ваш, я видел этот код так как тоже его делал. Это задание для прохождения на собеседование в одну из крупных украинских IT компаний. Для переключения между окнами используйте Loader QML Type . И на будущее если используете чужой код, изменяйте его, так как не честно использовать чужое, или хотя бы указывайте что код не мой. Будут вопросы пишите.
Реклама
  • 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 может собираться на пару гиг...