клиент-сервер в QT | QTcpServer просто!

Sdílet
Vložit
  • čas přidán 3. 06. 2024
  • В этом выпуске разберемся с клиент-серверными приложениями в Qt. Мы создадим клиент- серверный чат, в котором сообщения от каждого клиента будут приходить на сервер, а сервер будет рассылать эти сообщения всем подключенным клиентам. Мы рассмотрим работу сервера по протоколу TCP, научимся создавать и удалять сокеты, правильно формировать сообщения для отправки на сервер и клиент, принимать сообщения целиком и по частям, будем работать с классами потоковой передачи информации, контейнерами, дескрипторами, массивами байтов и все это в одном коротком ролике, как всегда с картинками, доступными понятными объяснениями и милыми пушистиками.
    таймкоды:
    00:00 - вступление
    00:44 - начинаем писать сервер
    01:24 - немного теории
    03:50 - продолжаем писать сервер
    04:41 - конструктор
    05:02 - обработка подключений
    05:50 - чтение сообщений
    06:50 - отправление сообщений
    07:30 - запуск сервера
    07:40 - пишем клиент
    10:34 - грамотная передача данных
    13:58 - добавляем крутую фишку
    #Qt #программирование #программныйКот

Komentáře • 124

  • @Mr.Ahavzi
    @Mr.Ahavzi Před rokem +15

    При каждом входящем подключении к серверу, указатель на новый сокет сохраняется в вектор Sockets, а при отключении клиента и формировании сигнала QTcpSocket::disconnected для этого сокета вызывается функция QTcpSocket::deleteLater, которая делает невалидным указатель на данный сокет в следующем лупе. При этом в векторе Sockets остается указатель на невалидный сокет, что при дальнейшей работе с оставшимися клиентами приведет к крешу сервера. Правильнее было бы сделать отдельный слот для обработки сигнала QTcpSocket::disconnected и в нем выполнять что то типа:
    Sockets.erase(std::remove(Socket.begin(), Socket.end(), socket), Socket.end());
    Socket->deleteLater();
    Естественно, перед этим в слоте необходимо скастовать объект, возвращаемый sender() к типу QTcpSocket*.
    ПС. Очень жаль, что на канале не выходят новые видео, подача контента довольно оригинальная, все по делу и без лишних слов. Надеюсь, что задержка с выходом видео временная и у автора будет снова возможность создавать контент.

  • @nikert1326
    @nikert1326 Před rokem +1

    Замечательное видео, все понятно, четко и ясно. Все получилось, все работает. Спасибо.

  • @DadundddaD
    @DadundddaD Před 6 měsíci +2

    2:14 - небольшая поправка: не потому что 0 брать нельзя (то есть не может быть числа 0), а потому что в записи, например, 8 битной: 1000 0000 будет обозначать только 2**7, хотя бит 8, потому что первый бит - это 2**0, но в сумме, от 0 до 1111 1111 как раз и будет 2**8 чисел.

  • @anilem4136
    @anilem4136 Před 2 lety +9

    Спасибо за твой труд!

  • @ravilizmailov3994
    @ravilizmailov3994 Před 2 lety +10

    Отличный монтаж и подача материала, продолжайте!

    • @programmcat
      @programmcat  Před 2 lety

      Спасибо за поддержку, надеюсь когда-нибудь выйти на монетизацию 😃 Qt что-то не особо заходит

  • @-USER_NAME
    @-USER_NAME Před 2 lety +4

    Вот вот .По методу величайшего казахского миллиардера Киосаки , простым языком о сложном. Спасибо за видео 👍

  • @user-ii8iz5df7z
    @user-ii8iz5df7z Před rokem +4

    легендарное видео ! благодарны всей группой

  • @daniilk4994
    @daniilk4994 Před měsícem +1

    Чтоб проект полностью пересобрать нужно:
    Очистить его
    Запустить QMake
    И можно собирать заново)
    Эта фигня происходит потому, что в qt генерируется куча дополнительных файлов, которых нет в обычных проектах на С++. И ради экономии времени сборки сам креатор не удаляет их перед новой сборкой)

  • @KOPbI4
    @KOPbI4 Před 2 lety +3

    Спасибо, долго не мог понять, помогло это видео. И желательно увеличить шрифт у IDE, не у всех 1080 мониторы)

  • @mariarudeyko2986
    @mariarudeyko2986 Před rokem +2

    Спасибо за видео! Начиная с Qt 5.7 можно также проверять, все ли данные пришли, с помощью QDataStream::startTransaction() и QDataStream::commitTransaction()

  • @universemessenger2674
    @universemessenger2674 Před rokem +1

    Спасибо тебе большое! Очень помог! 😊

  • @user-bh8xz4xy7o
    @user-bh8xz4xy7o Před rokem +1

    не, ну чисто гений!!
    спасибо за видео!

  • @user-lp1ir6qr2w
    @user-lp1ir6qr2w Před 2 lety +5

    10:13 Сборка->Очистить, после этого пересобрать, обычно фиксит довольно много багов

  • @pussycat6540
    @pussycat6540 Před 2 lety +2

    Спасибо большое за ролик.
    Вот как только я начал погружаться в тему сокетов Qt, так сразу же прилетело уведомление:
    новое видео на канале "Программный Кот" - клиент-сервер в QT | QTcpServer просто!

    • @programmcat
      @programmcat  Před 2 lety +2

      Повезло, мне бы такой видос не помешал, когда я учился 😀

  • @user-lc7dc7fz9b
    @user-lc7dc7fz9b Před 2 lety +2

    Просто спасибо!

  • @artyomgolenischev3708
    @artyomgolenischev3708 Před 2 lety +10

    У Вас всегда самые классные и полезные видео по QT! Огромная просьба, когда-нибудь снимите видео по печати документов в QT. В том плане что есть QTextDocument class или как создать HTML документ, чтобы напечатать лист А4 и вывести в него информацию из программы. Очень актуальная тема у многих)

    • @programmcat
      @programmcat  Před 2 lety +1

      Хорошо👍

    • @dimongnezdilov3267
      @dimongnezdilov3267 Před 2 lety +1

      Да, кстати ! Присоединился бы к обсуждению темы работы в QT с документами. Если, к примеру, чтение и запись в txt файл проблем не вызывает, то вот как быть с документами Word'a ? Знаю, что записать в Word-овский файл можно с помощью HTML, но вот как быть с чтением этого файла для меня до сих пор остаётся загадкой...

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      @@dimongnezdilov3267 погугли библиотеку для плюсов для работы с вордом.

    • @dimongnezdilov3267
      @dimongnezdilov3267 Před rokem

      @@user-mm5ln4qh5q спасибо за совет ))

  • @alexandrivanov9985
    @alexandrivanov9985 Před 2 lety +2

    Круто, очень помогло!

  • @gergkull8065
    @gergkull8065 Před 2 lety +2

    Огонь!!!!

  • @OpenFrimeTVcom
    @OpenFrimeTVcom Před 2 lety +19

    ого. это прям топ. очень жаль что такой контент люди не ценят(

    • @programmcat
      @programmcat  Před 2 lety +4

      Спасибо

    • @unrealengineruseng9583
      @unrealengineruseng9583 Před 2 lety

      Согласен, отличные уроки просто, я аж вспотел ))))

    • @user-vm6gj2iw8s
      @user-vm6gj2iw8s Před 2 lety

      @@programmcat друг не поможешь добавить передачу файлов в чат или картинок, очень надо просто

    • @programmcat
      @programmcat  Před 2 lety

      @@user-vm6gj2iw8s принцип такой-же

    • @user-vm6gj2iw8s
      @user-vm6gj2iw8s Před 2 lety

      @@programmcat а можно поподробнее узнать. Нужно вставлять картинку в сам textBrowser при нажатии на кнопку или как ?

  • @kodisworld7016
    @kodisworld7016 Před 2 lety +1

    Красавчик !

  • @user-ij7sr8kd5b
    @user-ij7sr8kd5b Před 2 lety +6

    вау , спасибо , это действительно полезно и интересно

  • @GuNStaRia
    @GuNStaRia Před rokem +2

    Не знаю, актуально или нет, но чтоб не чистить папку вручную как на 10:00, в пункте Меню -> Сборка есть опция "Очистить". Она делает все, как вы сказали, "грамотно"

  • @BlinCT
    @BlinCT Před rokem +1

    Отличный гайд, очень хорошо разобрано. Но есть вопрос, если это должно быть много поточным приложением, то есть под каждого нового клиента выделяется поток? Могли бы дать совет?

  • @user-st2on9qs3u
    @user-st2on9qs3u Před rokem +1

    Здравствуйте! Спасибо за прекрасный пример! О том, почему пришлось удалить файлы сборки и пересобрать проект. Смею предположить, что qt запускает первым тот файл, который был создан и собран последним. А так как сначала мы сделали сервер, а потом клиент, то qt сначала запускает файл с клиентом. А для правильной работы клиент-серверного приложения у нас должен быть уже включен сервер на момент подключения клиента. Обошла данную ситуацию следующим образом: нажала сначала правой кнопкой мыши на сервер и запустила код (run), сервер вывел "start", потом уже нажала запуск для всего проекта (зеленая кнопка слева внизу). Простите, если что-то коряво объясняю, с qt только начала знакомиться, да и в принципе опыта программирования еще маловато.

  • @traydr-1609
    @traydr-1609 Před rokem +1

    Ты лучший)

  • @DadundddaD
    @DadundddaD Před 6 měsíci

    Насчет того, что data и nextBlockSize инициализируются мусором - разумеется, поля классов С++ всегда надо инициализировать вручную. Контейнеры можно инициализировать так: data = {};

  • @DadundddaD
    @DadundddaD Před 6 měsíci

    Видео шикарное

  • @user-ly7cf9hh5x
    @user-ly7cf9hh5x Před 7 měsíci +1

    Отличное пояснение! Спасибо огромное! Я занимаюсь разработкой устройств в которых используются GSM модули. Работают по сути как клиенты. Вопрос!? Как выбрать хостинг для QT серверных приложений? Можете посоветовать?

  • @VladykaVladykov
    @VladykaVladykov Před 10 měsíci +1

    Активное ожидание напрягает, конечно

  • @user-ei9nk1ov5p
    @user-ei9nk1ov5p Před rokem

    Нереально крутой видос!!
    есть один момент, сделал все как в видео про сборку с экзешника, заливаю на гит, скачиваю, а там такая ошибка: не удается продолжить выполнение кода поскольку система не обнаружила qt5widgets, и еще пара библиотек dll,

  • @nokia_n-gage
    @nokia_n-gage Před rokem

    Спасибо!

  • @maksimlepel9594
    @maksimlepel9594 Před rokem

    Спасибо

  • @user-vm6gj2iw8s
    @user-vm6gj2iw8s Před 2 lety

    а могли бы показать как наладить передачу картинок?

  • @Km-pn3hf
    @Km-pn3hf Před 2 lety

    спасибо

  • @Mdwed
    @Mdwed Před 8 měsíci

    Спасибо за ролик
    А сервер может каким-то образом понять что подключение было потеряно?

  • @yunushkin88
    @yunushkin88 Před 2 lety +1

    О у меня 2 года назад почти такое же было задание на собеседовании)

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      Мне сегодня дали похожее тестовое задание - надо отправлять файлы по TCP/UDP с одной проги в другую

  • @usernamer519
    @usernamer519 Před 11 měsíci

    Отличный ролик, но очень медленно говорите, шутка, на 0.25 не могу уследить, за кодом :(
    В любом случае, спасибо, очень помогло.

  • @DadundddaD
    @DadundddaD Před 6 měsíci

    А почему размер блока всегда в 2 раза больше того, что мы отправляем?

  • @user-bv7lp1kd9h
    @user-bv7lp1kd9h Před rokem +2

    исходники бы оставил >

  • @user-fg1of5kt5t
    @user-fg1of5kt5t Před 2 lety +3

    Всё хорошо, только очень мелкий шрифт в IDE. Спасибо за урок!

    • @programmcat
      @programmcat  Před 2 lety

      Вы с телефона смотрите?

    • @user-fg1of5kt5t
      @user-fg1of5kt5t Před 2 lety

      @@programmcat С ноутбука, монитор 13''

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      У меня со шрифтом всё идеально

  • @user-sz8zi1zh4j
    @user-sz8zi1zh4j Před 3 měsíci

    Я хочу чтобы клиент при подключении к серверу получал от сервера дескриптор, который назначил сервер своему сокету на 5:10. как это сделать? С помощью механизма сигналов и слотов? как связать между собой два разных проекта с помощью этого механизма?

  • @ammonjerro396
    @ammonjerro396 Před rokem

    Всё очень круто, но есть один вопрос. Вы это всё сами из головы делали или по какой-то инструкции и в процессе были ошибки, которые вы исправляли по ходу написания?

    • @daniltoropov5623
      @daniltoropov5623 Před rokem +2

      Есть книга, где так же подробно описан подобный проект (хотя возможно автор именно от туда его и позаимствовал), называется "Qt 5.10. Профессиональное программирование на C++". Подобный проект находится на странице 555 Глава 39

    • @user-st2on9qs3u
      @user-st2on9qs3u Před rokem

      Мне без разницы откуда. Главное, что информация дана, всё наглядно и по делу, а если этот пример еще и на какой-то книге основывается - вообще супер. Даниле спасибо за название книги, постараюсь найти, почитать.

    • @ammonjerro396
      @ammonjerro396 Před rokem

      @@user-st2on9qs3u твоё мнение мне очень важно. Держи в курсе.

  • @toniess4620
    @toniess4620 Před rokem +1

    А возможно организовать модель клиент-сервер в рамках нелокальной сети (на разных устройствах, не подключенных к одной сети)? Заранее спасибо)

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      Ну таким же образом. Надо только IP в обеих программах указать другой.

  • @BITniki
    @BITniki Před 2 lety +2

    Ещё вопросик)
    Я решил реализовать удалённое управление мышью и у меня возникла проблема задержки обработки получаемых сообщений.
    Суть в том, что если я сделаю резкое движение пальцем, то сервер начинает опаздывать с обработкой сообщения. Причём так, что если я пошлю новое сообщение, то он начнёт обрабатывать старое, а если не посылаю, то стек сообщений так и лежит, ожидая своей очереди. Код slodReadyRead() у меня аналогичный. Есть идеи, как подобное исправить?

    • @programmcat
      @programmcat  Před 2 lety +1

      Да, нужно использовать другой протокол

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      Мб UDP вместо TCP заюзать?

  • @brainpet4474
    @brainpet4474 Před 3 měsíci

    з вектора Sockets треба видаляти укаватель на сокет коли він закривається

  • @Kangoshi_ru
    @Kangoshi_ru Před 2 lety

    Если один или несколько клиентов "отвалятся" от сервера во время передачи сообщения, то что произойдёт? Насколько я понимаю подтверждение приёма сообщения не происходит? Т.е. после восстановления соединения этот клиент уже не получит пропущенное сообщение? Сможет ли он вообще подключится, если сервер ещё не закроет его сокет? Каким образом сервер решает, что нужно закрыть сокет по тайм-ауту? И сколько времени составляет этот тайм-аут?

    • @Kangoshi_ru
      @Kangoshi_ru Před 2 lety

      Не говоря уже о проверке принимаемых сообщений, чтобы избежать возможных эксплойтов.

    • @programmcat
      @programmcat  Před 2 lety

      Слишком много вопросов задаёшь

  • @BlinCT
    @BlinCT Před rokem

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

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem +1

      Когда клиент попытается установить соединение с сервером, на сервере возникает соответствующее событие/сигнал и вызывается функция incomingConnection. А при получении сообщения от клиента вызовется readyRead. Циклы здесь не нужны

  • @kniazblitz5873
    @kniazblitz5873 Před rokem

    Может быть я что-то не понимаю, но где и в какой момент вызывается incommingConnection?

    • @user-xy5kq7mm6m
      @user-xy5kq7mm6m Před rokem +1

      Под капотом запускается. Эта функция виртуальная в QTcpServer. Засчёт полиморфизма будет использоваться реализация наиболее далекого потомка - в наш случае как раз класса Server.

  • @artyomgolenischev3708
    @artyomgolenischev3708 Před 2 lety +1

    Есть вопрос. Как думаете, можно ли по TCP наладить обмен данными таким же образом между ПК и микроконтроллером STM32 ? Микроконтроллер подключен через сетевую карту Ethernet.

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      Не вижу препятствий для этого

  • @user-ir9iq1qi1m
    @user-ir9iq1qi1m Před měsícem

    Есть у кого-нибудь код полностью всей этой штуки?

  • @NoName-ep8jk
    @NoName-ep8jk Před 11 měsíci

    ти не показав де ти викликав слот incomingConnection()...

  • @dmitriyalimov3475
    @dmitriyalimov3475 Před rokem

    Сервер выводит только "start" и всё, хотя всё написано аналогично. Подскажите как пофиксить?

    • @user-ix6mz2zm4p
      @user-ix6mz2zm4p Před rokem

      Слот incomingConnection и его аргумент нужно писать как в видео, это override.

  • @BITniki
    @BITniki Před 2 lety

    Видео топ!
    Слушай, а что за qintptr и зачем он тут? 5 секунд гугления мне не помогло

    • @programmcat
      @programmcat  Před 2 lety

      Это тип данных, целое положительное

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem +1

      А зачем гуглить, если можно навести мышь на этот тип и появится подсказка? о_О😶🤲
      Или нажать ПКМ -> Перейти к реализации.

  • @nikiforovpteacher
    @nikiforovpteacher Před 6 měsíci

    Написал код сервера в QT 6.2. Сразу выдает error и падает с ошибкой. 10я Windows. Код проверил 3 раза, совпадает вплоть до последнего значка.

    • @user-ir9iq1qi1m
      @user-ir9iq1qi1m Před měsícem

      Такая же штука. Нашли решение?

  • @ShandlRu
    @ShandlRu Před 10 měsíci

    А что делать, если клиенту не известен IP адрес сервера? Просто известно, что он в той же подсети? Как реализовать широковещательный запрос от клиента в сеть, чтобы сервер ему ответил и дал свой адрес, чтобы потом клиент с этим адресом сервера работал?

    • @programmcat
      @programmcat  Před 10 měsíci

      Никак

    • @ShandlRu
      @ShandlRu Před 10 měsíci

      @@programmcat неужели у Qt нет такой возможности? Это даже у SFML Network есть... Там клиент посылает по всей сети в режиме broadcast на нужный порт запрос и сервер может его обработать, получить адрес клиента и ему отправить свой адрес...

  • @Eric_Tijuana
    @Eric_Tijuana Před rokem +1

    Всё бы хорошо но очень маленький шрифт, очень тяжело разглядеть

    • @programmcat
      @programmcat  Před rokem

      Попробуй посмотреть с компьютера, говорят помогает

    • @Eric_Tijuana
      @Eric_Tijuana Před rokem

      @@programmcat да я с компа и смотрю мб монитор маленький

  • @user-ir9iq1qi1m
    @user-ir9iq1qi1m Před měsícem

    Может подскажет кто-нибудь как пофиксить. Сделал все один в один а incomingConnection почему-то не запускается, с чем это может дать связано? Может надо где-то слот поставить, или собрать как-то по-особенному. Папки с сборкой я удали и пересобрал перед запуском.

    • @user-ir9iq1qi1m
      @user-ir9iq1qi1m Před měsícem

      Получается что просто не может клиент подключиться к серверу

    • @grundezz7331
      @grundezz7331 Před 2 dny

      @@user-ir9iq1qi1m Такая же проблема, решил?

  • @idodoqdo5783
    @idodoqdo5783 Před rokem

    Сделал все тоже самое, аналогичный код, но клиент не подключается к серверу. Сервер как вывел 1 раз "start" так больше ничего не видит. Помогите пожалуйста; может кто сталкивался с такой проблемой? Клин и ребилд не помогли

    • @idodoqdo5783
      @idodoqdo5783 Před rokem

      Почему-то приложение каждый раз выбирает новый порт, а не указаный 2323

    • @idodoqdo5783
      @idodoqdo5783 Před rokem

      Я просто по невнимательности ставил порт в ифе через запятую после listen(). Всё работает

    • @dmitriyalimov3475
      @dmitriyalimov3475 Před rokem

      @@idodoqdo5783 У меня такая же ошибка, только всё правильно написано, как пофиксить?

    • @grundezz7331
      @grundezz7331 Před 2 dny

      @@dmitriyalimov3475 Такая же проблема, нашел решение?

  • @dashitsybikzhapov9850

    Могу ли я кому нибудь раздать клиент, и чатиться на разных машинах

    • @programmcat
      @programmcat  Před rokem

      да

    • @programmcat
      @programmcat  Před rokem

      в локальной сети только, с интернетом по другому работает

    • @dashitsybikzhapov9850
      @dashitsybikzhapov9850 Před rokem

      @@programmcat раздается папка с релизом правильно понимаю?)

    • @programmcat
      @programmcat  Před rokem

      @@dashitsybikzhapov9850 czcams.com/video/F9ihThZPUvc/video.html

    • @user-ds9xo6er3v
      @user-ds9xo6er3v Před rokem

      @@programmcat А как сделать так, чтобы общение было через интернет?

  • @TheTiznone
    @TheTiznone Před rokem

    Если один клиент отключится от такого сервера, то он крашнется

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      А как в таком случае проверить работоспособность сокета?

    • @TheTiznone
      @TheTiznone Před rokem

      @@user-mm5ln4qh5q можно удалять сокет из пула, при отключении клиента, использовав мапу вместо вектора

    • @user-mm5ln4qh5q
      @user-mm5ln4qh5q Před rokem

      @@TheTiznone а как сервер поймёт, что клиент отвалился?

    • @TheTiznone
      @TheTiznone Před rokem

      @@user-mm5ln4qh5q По сигналу disconnected от сокета

    • @mariarudeyko2986
      @mariarudeyko2986 Před rokem

      @@TheTiznone можно ведь и из вектора удалить

  • @nakamasama
    @nakamasama Před 2 lety +4

    Как фиксить проблему? Никак! У самого есть такая проблема. Например, сейчас я работаю над библиотекой для обработки данных. Библиотеки Qt не использую, Qt я использую только как IDE для С++. Для библиотеки я создал тестовую программу, где я тестирую работу функционала библиотеки. И после каждой второй-третьей сборки я удаляю директорию скомпилированной библиотеки. Как я вычитал на не одном десятке форумов, посвящённых Qt, это связанно с метаобъектным компилятором. Ты пишешь несколько классов, пишешь их методы, компилируешь. Qt сначала пропускает твою программу через свой метаобъектный компилятор. Так как компилятор С++ не понимает концепции сигналов и слотов, Q_OBJECT и т.д. - это вынужденная мера. После того, как метаобъектный компилятор переведёт твою программу на обычный С++, этот код передаётся уже обычному С++ компилятору из комплекта, который ты указываешь в настройках проекта. Суть: после первой компиляции создаётся метаобъектный файл твоей программы и если ты будешь изменять уже скомпилированные классы - будет находится этот объект в метаобъектном файле и изменятся. Если ты будешь создавать новые классы - они не будут находится и будет выдаваться ошибка. Нужно просто удалить всю директорию со скомпилированной программой (я предполагаю, что этот метаобъектный файл связан со всеми объектными файлами, которые компилируются). Тогда при компиляции будет создаваться новый метаобъектный файл и ошибок не будет. Почему так? Не знаю... Может быть так только на Винде, а на других системах такого нет. Может эту ошибку не могут пофиксить из-за секретных технологий работы этого самого метаобъектного компилятора (мы просто чего-то не знаем). По-моему, решение я вычитал как раз на официальном форуме Qt поддержки, что нужно просто удалять скомпилированную директорию.
    Лично мне это не мешает.
    По поводу контента: как всегда лучший. Вот в этой теме я сам не разбираюсь, но было всё понятно. Другое дело, что кода почти не видно. Он на половину ширины. Для зума можно использовать комбинацию Ctrl++ (это так, на будущее). Я поддерживаю развитие твоего контента и контента по Qt.
    Я, кстати, знаю, почему некоторые не хотят изучать Qt. Дизайн IDE устаревший. Я бы это назвал "Привет, 2001". Я три раза искал другие IDE, которые позволят использовать Qt библиотеки, но это так заморочено... Я решил поискать темы для Qt. И нашёл. Теперь в моём Qt установлена тема "One monokai", которая стоит у меня в VS Code. Для меня это лучшая тема! У меня есть совет: сними ролик, как искать темы для Qt на ГитХабе, какие файлы нужны (их два на одну тему), куда устанавливать эти файлы и как переключать темы в Qt. Если ты снимешь такой ролик, программисты подумают над дизайном Qt и перестанут считать его устаревшим, что может привести к популяризации Qt и твоего канала.

    • @programmcat
      @programmcat  Před 2 lety +2

      Спасибо! До метода додумался сам где-то полгода назад, когда несколько дней не мог понять, почему не работает рабочий код. Всегда считал что должен быть другой выход, на форумах ничего найти не мог подобного ))

    • @nakamasama
      @nakamasama Před 2 lety +1

      @Eugene Я даже расширения ставил. У меня он всё равно все подключаемые библиотеки подчёркивает и кажет, что у меня их нет. Так ошибкой он считает любой метод, который я пытаюсь использовать. Это во-первых. А во-вторых, всё равно ведь нужно открыть Qt и там собирать приложения. В VSCode нет даже расширения для qmake и метаобъектного компилятора Qt, а CMake не решает проблему с тем же метаобъектным компилятором. Так зачем писать код в VSCode потом переключаться на Qt и собирать программу? Легче, когда всё в одном. Теперь, когда я настроил вид и тему Qt, мне будет приятнее им пользоваться. Вот если использовать Qt при написании программ на Питоне, тут всё элементарно. Скачал PyQt через pip и спокойно пишешь себе код. Никаких проблем.
      У Вас может и работает, не спорю. Но у меня нет.

    • @nakamasama
      @nakamasama Před 2 lety

      @Eugene Да. Я ещё раз перечитал. Я неправильно понял. Объясняю. Я Visual Studio не рассматриваю, так как у него нет версии для Линукса. Я разрабатываю программы одновременно для двух систем и на двух системах. Да и лично у меня он (VS) в базовой комплектации занимал больше места, чем Qt, и после запуска требует больше оперативки. У Вас может быть по другому. Почему я сравниваю простой редактор и полноценную IDE? Потому что для написания простых библиотек или консольных приложений на С++ мне достаточно простого редактора кода. И для сборки проектов я пишу собственные makefiles. Мне так удобнее. Для этого мне не нужны мощности Qt. Qt я использую только для написания графических приложения. Также я немного пишу на Питоне. Для него мне с головой хватает возможностей редактора кода. Да, я пляшу с компиляторами и прочая, как Вы пишете. Пускай это не проще, но мне так удобнее.
      Однако если бы Visual Studio был бы на Линуксе, я бы с радостью им бы пользовался. Так как я пользуюсь обеими системами (такие обстоятельства, по другому пока не могу), мне приходится пользоваться кроссплатформенными решениями. Поэтому я использую и Qt, и VS Code. Всё зависит от поставленных задач и проекта.
      В любом случае, вопросы "чем пользоваться?" и "как пользоваться?" - это вкусовщина. Каждый останется при своём мнении.

    • @nakamasama
      @nakamasama Před 2 lety

      @Eugene Я, кстати вспомнил главную причину, почему я им не хочу пользоваться. Когда VS создаёт проект, там создаётся куча лишних файлов, которые нужны только IDE. В то время, когда нужно написать простую программу, можно создать один или пару файлов проекта и самому его скомпилировать. Указав нужный ключ (-s), конечный экзешник будет весить сотню килобайт, без него программа весит 3 МБ. При написании программ на VS, её нужно сначала как-то настроить, чтобы она компилировала лёгкие экзешники, иначе все будут весить по 3 МБ. Да и в целом он медленнее компилирует.
      Есть одна вещь в VS, от которой у меня сильно подгарает. Это его отношение к массивам. Точнее, его компилятора. Я просто не могу писать программы с использованием массивов на VS. У него используется свой компилятор MSVS, который я всем своим духом не переношу. Как только я где-то вижу или слышу этот компилятор - меня начинает тошнить. А поменять на свой - НЕЛЬЗЯ! Я пользуюсь компилятором TDM-GCC. Как по мне он самый лучший.
      Я пользовался большим количеством IDE. Я искал хорошее решение. И все при создании проекта создают кучу лишних не нужных файлов проекту. Они нужны только IDE. Но есть одно исключение - Qt. Только одна эта IDE не создаёт ничего лишнего: только файлы с кодом и .pro-файл (аналог makefile).
      Вывод: из-за отсутствия кроссплатформенности, создания кучи лишних файлов (не пойми для чего нужных), невозможности изменить компилятор и просто тяжеловесности я не пользуюсь этой IDE и не буду пользоваться. Я передумаю только тогда, когда появится возможность менять компилятор и устанавливать IDE на линукс.

    • @nakamasama
      @nakamasama Před 2 lety

      @Eugene А я и не утверждал, что знаю студию. Как указать в VS компилировать релиз я не нашёл. Там было просто "собрать проект" и после сборки он весит несколько МБ. Процесс сборки программ я знаю. Я про это и не говорил. Когда создаётся проект, вместе с кодом создаётся несколько директорий с ненужными проекту файлами. Например, когда я пользовался IDE от JatBrains, там всегда создавалась директория .idea . Я про это говорил. В VSCode создаётся папка .vscode в которой хранятся файлы настроек .json (если менять настройки редактора). VS создаёт файлы, которые не участвуют в процессе компиляции. Когда Вы нажимаете кнопку "открыть проект", появляется окно, в котором Вы выбираете проект, и там есть один файл, который служит только для открытия выбранного проекта в IDE и не для чего больше. Для чего нужны остальные файлы я не знаю. В других IDE таких файлов нет. Про папку с объектными файлами я ничего не говорил.
      Да, есть стандарт компилятор языков С/С++, но MSVS не придерживается этого стандарта. Он его нарушает. Так говорят на всех форумах, которые я читаю.
      Если рассматривать ситуацию конкретно про массивы, то я не могу указать не константный размер массива. Я должен передать или число или переменную с ключевым словом const, иначе программа не скомпилируется. И если так поступить - нельзя написать такую функцию, чтобы пользователь сам вводил размер массива. Это всё было больше года назад, когда я только начинал изучать программирование. У меня была лабораторка с заданием по массивам. Пользователь должен был сам ввести размер массива, после чего должна была быть выделена память под массив такого объёма, который укажет пользователь. У меня в VS выдавалась ошибка, что размер массива должен быть константым. Я тогда перешёл на DEV-C++ и там этот же код скомпилировался и заработал без ошибок. Как я потом вычитал, это так работает их компилятор. В советах на форуме было: поменять компилятор. Так что не нужно переводить стрелки: MSVS написан не по стандарту компиляторов и нарушает его. Ссылки дать не могу - ютуб удаляет комментарии со ссылками. В любом случае, это было 1 год и 2 месяца назад. С тех пор я не пользовался Visual Studio и осталось о нём негативные воспоминания.
      Я изучаю программирование только полтора года, а с VS я работал пару дней. Из-за его компилятора я не мог писать программы и пришлось искать другое IDE. Я не спорю, что Вы знаете больше меня. Но за последний год я много нужных знаний получил. Я описал две объективные проблемы для меня. Для Вас они могут быть и не объективны. Я приводил аргументы связанные только с IDE, а не с компилятором и тому прочим, поэтому не нужно говорить, что я не знаю, как работает компиляция, линковка и тому прочее. Но я мог просто неправильно выразиться на счёт лишних файлов и Вы могли меня не правильно понять.
      Я привёл два своих аргумента: кроссплатформенность и компилятор. Думаю, обсуждение сравнения Qt и VS можно закрыть. Мне всё равно больше нечего добавить. Если хотите, можете считать, что я не разбираюсь в VS. Тема не посвящена VS, а Qt. В нём-то я хорошо разбираюсь.

  • @eedle4852
    @eedle4852 Před 2 lety +1

    Привет! Когда ты записуешь данные в массив, я про сервер если что, то можно использовать флаг QIODevice::Truncate. Вместо Data.clear().