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

  Рет қаралды 34,163

Программный Кот

Программный Кот

Күн бұрын

В этом выпуске разберемся с клиент-серверными приложениями в 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 #программирование #программныйКот

Пікірлер: 125
@Mr.Ahavzi
@Mr.Ahavzi Жыл бұрын
При каждом входящем подключении к серверу, указатель на новый сокет сохраняется в вектор Sockets, а при отключении клиента и формировании сигнала QTcpSocket::disconnected для этого сокета вызывается функция QTcpSocket::deleteLater, которая делает невалидным указатель на данный сокет в следующем лупе. При этом в векторе Sockets остается указатель на невалидный сокет, что при дальнейшей работе с оставшимися клиентами приведет к крешу сервера. Правильнее было бы сделать отдельный слот для обработки сигнала QTcpSocket::disconnected и в нем выполнять что то типа: Sockets.erase(std::remove(Socket.begin(), Socket.end(), socket), Socket.end()); Socket->deleteLater(); Естественно, перед этим в слоте необходимо скастовать объект, возвращаемый sender() к типу QTcpSocket*. ПС. Очень жаль, что на канале не выходят новые видео, подача контента довольно оригинальная, все по делу и без лишних слов. Надеюсь, что задержка с выходом видео временная и у автора будет снова возможность создавать контент.
@grevlir8732
@grevlir8732 29 күн бұрын
Премного благодарен, НИГДЕ не мог найти именно вот эту функцию о которой ты написал, хотя перерыл достаточно много "ентернета ентого"! Вот как у меня выглядит слот (всё под копирку с твоих слов, просто в виде кода): void Server::slotClientDisconnected() { socket = (QTcpSocket*)sender(); Sockets.erase(std::remove(Sockets.begin(), Sockets.end(), socket), Sockets.end()); socket->deleteLater(); }
@anilem4136
@anilem4136 2 жыл бұрын
Спасибо за твой труд!
@nikert1326
@nikert1326 Жыл бұрын
Замечательное видео, все понятно, четко и ясно. Все получилось, все работает. Спасибо.
@ravilizmailov3994
@ravilizmailov3994 2 жыл бұрын
Отличный монтаж и подача материала, продолжайте!
@programmcat
@programmcat 2 жыл бұрын
Спасибо за поддержку, надеюсь когда-нибудь выйти на монетизацию 😃 Qt что-то не особо заходит
@user-ii8iz5df7z
@user-ii8iz5df7z Жыл бұрын
легендарное видео ! благодарны всей группой
@universemessenger2674
@universemessenger2674 Жыл бұрын
Спасибо тебе большое! Очень помог! 😊
@user-bh8xz4xy7o
@user-bh8xz4xy7o Жыл бұрын
не, ну чисто гений!! спасибо за видео!
@-USER_NAME
@-USER_NAME 2 жыл бұрын
Вот вот .По методу величайшего казахского миллиардера Киосаки , простым языком о сложном. Спасибо за видео 👍
@user-lc7dc7fz9b
@user-lc7dc7fz9b 2 жыл бұрын
Просто спасибо!
@Корыч
@Корыч 2 жыл бұрын
Спасибо, долго не мог понять, помогло это видео. И желательно увеличить шрифт у IDE, не у всех 1080 мониторы)
@DadundddaD
@DadundddaD 8 ай бұрын
2:14 - небольшая поправка: не потому что 0 брать нельзя (то есть не может быть числа 0), а потому что в записи, например, 8 битной: 1000 0000 будет обозначать только 2**7, хотя бит 8, потому что первый бит - это 2**0, но в сумме, от 0 до 1111 1111 как раз и будет 2**8 чисел.
@user-lp1ir6qr2w
@user-lp1ir6qr2w 2 жыл бұрын
10:13 Сборка->Очистить, после этого пересобрать, обычно фиксит довольно много багов
@mariarudeyko2986
@mariarudeyko2986 Жыл бұрын
Спасибо за видео! Начиная с Qt 5.7 можно также проверять, все ли данные пришли, с помощью QDataStream::startTransaction() и QDataStream::commitTransaction()
@pussycat6540
@pussycat6540 2 жыл бұрын
Спасибо большое за ролик. Вот как только я начал погружаться в тему сокетов Qt, так сразу же прилетело уведомление: новое видео на канале "Программный Кот" - клиент-сервер в QT | QTcpServer просто!
@programmcat
@programmcat 2 жыл бұрын
Повезло, мне бы такой видос не помешал, когда я учился 😀
@alexandrivanov9985
@alexandrivanov9985 2 жыл бұрын
Круто, очень помогло!
@user-ij7sr8kd5b
@user-ij7sr8kd5b 2 жыл бұрын
вау , спасибо , это действительно полезно и интересно
@programmcat
@programmcat 2 жыл бұрын
Лайк, подписка))
@gergkull8065
@gergkull8065 2 жыл бұрын
Огонь!!!!
@OpenFrimeTVcom
@OpenFrimeTVcom 2 жыл бұрын
ого. это прям топ. очень жаль что такой контент люди не ценят(
@programmcat
@programmcat 2 жыл бұрын
Спасибо
@unrealengineruseng9583
@unrealengineruseng9583 2 жыл бұрын
Согласен, отличные уроки просто, я аж вспотел ))))
@user-vm6gj2iw8s
@user-vm6gj2iw8s 2 жыл бұрын
@@programmcat друг не поможешь добавить передачу файлов в чат или картинок, очень надо просто
@programmcat
@programmcat 2 жыл бұрын
@@user-vm6gj2iw8s принцип такой-же
@user-vm6gj2iw8s
@user-vm6gj2iw8s 2 жыл бұрын
@@programmcat а можно поподробнее узнать. Нужно вставлять картинку в сам textBrowser при нажатии на кнопку или как ?
@daniilk4994
@daniilk4994 3 ай бұрын
Чтоб проект полностью пересобрать нужно: Очистить его Запустить QMake И можно собирать заново) Эта фигня происходит потому, что в qt генерируется куча дополнительных файлов, которых нет в обычных проектах на С++. И ради экономии времени сборки сам креатор не удаляет их перед новой сборкой)
@kodisworld7016
@kodisworld7016 2 жыл бұрын
Красавчик !
@artyomgolenischev3708
@artyomgolenischev3708 2 жыл бұрын
У Вас всегда самые классные и полезные видео по QT! Огромная просьба, когда-нибудь снимите видео по печати документов в QT. В том плане что есть QTextDocument class или как создать HTML документ, чтобы напечатать лист А4 и вывести в него информацию из программы. Очень актуальная тема у многих)
@programmcat
@programmcat 2 жыл бұрын
Хорошо👍
@dimongnezdilov3267
@dimongnezdilov3267 2 жыл бұрын
Да, кстати ! Присоединился бы к обсуждению темы работы в QT с документами. Если, к примеру, чтение и запись в txt файл проблем не вызывает, то вот как быть с документами Word'a ? Знаю, что записать в Word-овский файл можно с помощью HTML, но вот как быть с чтением этого файла для меня до сих пор остаётся загадкой...
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
@@dimongnezdilov3267 погугли библиотеку для плюсов для работы с вордом.
@dimongnezdilov3267
@dimongnezdilov3267 2 жыл бұрын
@@user-mm5ln4qh5q спасибо за совет ))
@nokia_n-gage
@nokia_n-gage Жыл бұрын
Спасибо!
@DadundddaD
@DadundddaD 8 ай бұрын
Видео шикарное
@maksimlepel9594
@maksimlepel9594 Жыл бұрын
Спасибо
@Km-pn3hf
@Km-pn3hf 2 жыл бұрын
спасибо
@traydr-1609
@traydr-1609 Жыл бұрын
Ты лучший)
@user-st2on9qs3u
@user-st2on9qs3u Жыл бұрын
Здравствуйте! Спасибо за прекрасный пример! О том, почему пришлось удалить файлы сборки и пересобрать проект. Смею предположить, что qt запускает первым тот файл, который был создан и собран последним. А так как сначала мы сделали сервер, а потом клиент, то qt сначала запускает файл с клиентом. А для правильной работы клиент-серверного приложения у нас должен быть уже включен сервер на момент подключения клиента. Обошла данную ситуацию следующим образом: нажала сначала правой кнопкой мыши на сервер и запустила код (run), сервер вывел "start", потом уже нажала запуск для всего проекта (зеленая кнопка слева внизу). Простите, если что-то коряво объясняю, с qt только начала знакомиться, да и в принципе опыта программирования еще маловато.
@avtomatoUwU
@avtomatoUwU Жыл бұрын
Спасибо!
@GuNStaRia
@GuNStaRia Жыл бұрын
Не знаю, актуально или нет, но чтоб не чистить папку вручную как на 10:00, в пункте Меню -> Сборка есть опция "Очистить". Она делает все, как вы сказали, "грамотно"
@VladykaVladykov
@VladykaVladykov Жыл бұрын
Активное ожидание напрягает, конечно
@BlinCT
@BlinCT 2 жыл бұрын
Отличный гайд, очень хорошо разобрано. Но есть вопрос, если это должно быть много поточным приложением, то есть под каждого нового клиента выделяется поток? Могли бы дать совет?
@user-ly7cf9hh5x
@user-ly7cf9hh5x 9 ай бұрын
Отличное пояснение! Спасибо огромное! Я занимаюсь разработкой устройств в которых используются GSM модули. Работают по сути как клиенты. Вопрос!? Как выбрать хостинг для QT серверных приложений? Можете посоветовать?
@user-ei9nk1ov5p
@user-ei9nk1ov5p Жыл бұрын
Нереально крутой видос!! есть один момент, сделал все как в видео про сборку с экзешника, заливаю на гит, скачиваю, а там такая ошибка: не удается продолжить выполнение кода поскольку система не обнаружила qt5widgets, и еще пара библиотек dll,
@DadundddaD
@DadundddaD 8 ай бұрын
Насчет того, что data и nextBlockSize инициализируются мусором - разумеется, поля классов С++ всегда надо инициализировать вручную. Контейнеры можно инициализировать так: data = {};
@yunushkin88
@yunushkin88 2 жыл бұрын
О у меня 2 года назад почти такое же было задание на собеседовании)
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
Мне сегодня дали похожее тестовое задание - надо отправлять файлы по TCP/UDP с одной проги в другую
@user-bv7lp1kd9h
@user-bv7lp1kd9h Жыл бұрын
исходники бы оставил >
@user-vm6gj2iw8s
@user-vm6gj2iw8s 2 жыл бұрын
а могли бы показать как наладить передачу картинок?
@user-fg1of5kt5t
@user-fg1of5kt5t 2 жыл бұрын
Всё хорошо, только очень мелкий шрифт в IDE. Спасибо за урок!
@programmcat
@programmcat 2 жыл бұрын
Вы с телефона смотрите?
@user-fg1of5kt5t
@user-fg1of5kt5t 2 жыл бұрын
@@programmcat С ноутбука, монитор 13''
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
У меня со шрифтом всё идеально
@Mdwed
@Mdwed 10 ай бұрын
Спасибо за ролик А сервер может каким-то образом понять что подключение было потеряно?
@usernamer519
@usernamer519 Жыл бұрын
Отличный ролик, но очень медленно говорите, шутка, на 0.25 не могу уследить, за кодом :( В любом случае, спасибо, очень помогло.
@ammonjerro396
@ammonjerro396 Жыл бұрын
Всё очень круто, но есть один вопрос. Вы это всё сами из головы делали или по какой-то инструкции и в процессе были ошибки, которые вы исправляли по ходу написания?
@daniltoropov5623
@daniltoropov5623 Жыл бұрын
Есть книга, где так же подробно описан подобный проект (хотя возможно автор именно от туда его и позаимствовал), называется "Qt 5.10. Профессиональное программирование на C++". Подобный проект находится на странице 555 Глава 39
@user-st2on9qs3u
@user-st2on9qs3u Жыл бұрын
Мне без разницы откуда. Главное, что информация дана, всё наглядно и по делу, а если этот пример еще и на какой-то книге основывается - вообще супер. Даниле спасибо за название книги, постараюсь найти, почитать.
@ammonjerro396
@ammonjerro396 Жыл бұрын
@@user-st2on9qs3u твоё мнение мне очень важно. Держи в курсе.
@toniess4620
@toniess4620 2 жыл бұрын
А возможно организовать модель клиент-сервер в рамках нелокальной сети (на разных устройствах, не подключенных к одной сети)? Заранее спасибо)
@user-mm5ln4qh5q
@user-mm5ln4qh5q Жыл бұрын
Ну таким же образом. Надо только IP в обеих программах указать другой.
@DadundddaD
@DadundddaD 8 ай бұрын
А почему размер блока всегда в 2 раза больше того, что мы отправляем?
@BITniki
@BITniki 2 жыл бұрын
Ещё вопросик) Я решил реализовать удалённое управление мышью и у меня возникла проблема задержки обработки получаемых сообщений. Суть в том, что если я сделаю резкое движение пальцем, то сервер начинает опаздывать с обработкой сообщения. Причём так, что если я пошлю новое сообщение, то он начнёт обрабатывать старое, а если не посылаю, то стек сообщений так и лежит, ожидая своей очереди. Код slodReadyRead() у меня аналогичный. Есть идеи, как подобное исправить?
@programmcat
@programmcat 2 жыл бұрын
Да, нужно использовать другой протокол
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
Мб UDP вместо TCP заюзать?
@user-sz8zi1zh4j
@user-sz8zi1zh4j 5 ай бұрын
Я хочу чтобы клиент при подключении к серверу получал от сервера дескриптор, который назначил сервер своему сокету на 5:10. как это сделать? С помощью механизма сигналов и слотов? как связать между собой два разных проекта с помощью этого механизма?
@brainpet4474
@brainpet4474 5 ай бұрын
з вектора Sockets треба видаляти укаватель на сокет коли він закривається
@user-ir9iq1qi1m
@user-ir9iq1qi1m 3 ай бұрын
Есть у кого-нибудь код полностью всей этой штуки?
@Kangoshi_ru
@Kangoshi_ru 2 жыл бұрын
Если один или несколько клиентов "отвалятся" от сервера во время передачи сообщения, то что произойдёт? Насколько я понимаю подтверждение приёма сообщения не происходит? Т.е. после восстановления соединения этот клиент уже не получит пропущенное сообщение? Сможет ли он вообще подключится, если сервер ещё не закроет его сокет? Каким образом сервер решает, что нужно закрыть сокет по тайм-ауту? И сколько времени составляет этот тайм-аут?
@Kangoshi_ru
@Kangoshi_ru 2 жыл бұрын
Не говоря уже о проверке принимаемых сообщений, чтобы избежать возможных эксплойтов.
@programmcat
@programmcat 2 жыл бұрын
Слишком много вопросов задаёшь
@kniazblitz5873
@kniazblitz5873 Жыл бұрын
Может быть я что-то не понимаю, но где и в какой момент вызывается incommingConnection?
@user-xy5kq7mm6m
@user-xy5kq7mm6m Жыл бұрын
Под капотом запускается. Эта функция виртуальная в QTcpServer. Засчёт полиморфизма будет использоваться реализация наиболее далекого потомка - в наш случае как раз класса Server.
@BlinCT
@BlinCT 2 жыл бұрын
И еще малый вопрос, сервер же должен в бесконечном цыкле крутиться и постоянно быть запущенным. А у вас я что-то не увидел этого. Или я что то не допонял.
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
Когда клиент попытается установить соединение с сервером, на сервере возникает соответствующее событие/сигнал и вызывается функция incomingConnection. А при получении сообщения от клиента вызовется readyRead. Циклы здесь не нужны
@BITniki
@BITniki 2 жыл бұрын
Видео топ! Слушай, а что за qintptr и зачем он тут? 5 секунд гугления мне не помогло
@programmcat
@programmcat 2 жыл бұрын
Это тип данных, целое положительное
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
А зачем гуглить, если можно навести мышь на этот тип и появится подсказка? о_О😶🤲 Или нажать ПКМ -> Перейти к реализации.
@nikiforovpteacher
@nikiforovpteacher 8 ай бұрын
Написал код сервера в QT 6.2. Сразу выдает error и падает с ошибкой. 10я Windows. Код проверил 3 раза, совпадает вплоть до последнего значка.
@user-ir9iq1qi1m
@user-ir9iq1qi1m 3 ай бұрын
Такая же штука. Нашли решение?
@dmitriyalimov3475
@dmitriyalimov3475 Жыл бұрын
Сервер выводит только "start" и всё, хотя всё написано аналогично. Подскажите как пофиксить?
@user-ix6mz2zm4p
@user-ix6mz2zm4p Жыл бұрын
Слот incomingConnection и его аргумент нужно писать как в видео, это override.
@Eric_Tijuana
@Eric_Tijuana Жыл бұрын
Всё бы хорошо но очень маленький шрифт, очень тяжело разглядеть
@programmcat
@programmcat Жыл бұрын
Попробуй посмотреть с компьютера, говорят помогает
@Eric_Tijuana
@Eric_Tijuana Жыл бұрын
@@programmcat да я с компа и смотрю мб монитор маленький
@artyomgolenischev3708
@artyomgolenischev3708 2 жыл бұрын
Есть вопрос. Как думаете, можно ли по TCP наладить обмен данными таким же образом между ПК и микроконтроллером STM32 ? Микроконтроллер подключен через сетевую карту Ethernet.
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
Не вижу препятствий для этого
@NoName-ep8jk
@NoName-ep8jk Жыл бұрын
ти не показав де ти викликав слот incomingConnection()...
@user-ir9iq1qi1m
@user-ir9iq1qi1m 3 ай бұрын
Может подскажет кто-нибудь как пофиксить. Сделал все один в один а incomingConnection почему-то не запускается, с чем это может дать связано? Может надо где-то слот поставить, или собрать как-то по-особенному. Папки с сборкой я удали и пересобрал перед запуском.
@user-ir9iq1qi1m
@user-ir9iq1qi1m 3 ай бұрын
Получается что просто не может клиент подключиться к серверу
@grundezz7331
@grundezz7331 2 ай бұрын
@@user-ir9iq1qi1m Такая же проблема, решил?
@ShandlRu
@ShandlRu Жыл бұрын
А что делать, если клиенту не известен IP адрес сервера? Просто известно, что он в той же подсети? Как реализовать широковещательный запрос от клиента в сеть, чтобы сервер ему ответил и дал свой адрес, чтобы потом клиент с этим адресом сервера работал?
@programmcat
@programmcat Жыл бұрын
Никак
@ShandlRu
@ShandlRu Жыл бұрын
@@programmcat неужели у Qt нет такой возможности? Это даже у SFML Network есть... Там клиент посылает по всей сети в режиме broadcast на нужный порт запрос и сервер может его обработать, получить адрес клиента и ему отправить свой адрес...
@idodoqdo5783
@idodoqdo5783 Жыл бұрын
Сделал все тоже самое, аналогичный код, но клиент не подключается к серверу. Сервер как вывел 1 раз "start" так больше ничего не видит. Помогите пожалуйста; может кто сталкивался с такой проблемой? Клин и ребилд не помогли
@idodoqdo5783
@idodoqdo5783 Жыл бұрын
Почему-то приложение каждый раз выбирает новый порт, а не указаный 2323
@idodoqdo5783
@idodoqdo5783 Жыл бұрын
Я просто по невнимательности ставил порт в ифе через запятую после listen(). Всё работает
@dmitriyalimov3475
@dmitriyalimov3475 Жыл бұрын
@@idodoqdo5783 У меня такая же ошибка, только всё правильно написано, как пофиксить?
@grundezz7331
@grundezz7331 2 ай бұрын
@@dmitriyalimov3475 Такая же проблема, нашел решение?
@dashitsybikzhapov9850
@dashitsybikzhapov9850 Жыл бұрын
Могу ли я кому нибудь раздать клиент, и чатиться на разных машинах
@programmcat
@programmcat Жыл бұрын
да
@programmcat
@programmcat Жыл бұрын
в локальной сети только, с интернетом по другому работает
@dashitsybikzhapov9850
@dashitsybikzhapov9850 Жыл бұрын
@@programmcat раздается папка с релизом правильно понимаю?)
@programmcat
@programmcat Жыл бұрын
@@dashitsybikzhapov9850 kzbin.info/www/bejne/fGrMmYeej7WIrMU
@user-ds9xo6er3v
@user-ds9xo6er3v Жыл бұрын
@@programmcat А как сделать так, чтобы общение было через интернет?
@TheTiznone
@TheTiznone 2 жыл бұрын
Если один клиент отключится от такого сервера, то он крашнется
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
А как в таком случае проверить работоспособность сокета?
@TheTiznone
@TheTiznone 2 жыл бұрын
@@user-mm5ln4qh5q можно удалять сокет из пула, при отключении клиента, использовав мапу вместо вектора
@user-mm5ln4qh5q
@user-mm5ln4qh5q 2 жыл бұрын
@@TheTiznone а как сервер поймёт, что клиент отвалился?
@TheTiznone
@TheTiznone 2 жыл бұрын
@@user-mm5ln4qh5q По сигналу disconnected от сокета
@mariarudeyko2986
@mariarudeyko2986 Жыл бұрын
@@TheTiznone можно ведь и из вектора удалить
@nakamasama
@nakamasama 2 жыл бұрын
Как фиксить проблему? Никак! У самого есть такая проблема. Например, сейчас я работаю над библиотекой для обработки данных. Библиотеки 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 2 жыл бұрын
Спасибо! До метода додумался сам где-то полгода назад, когда несколько дней не мог понять, почему не работает рабочий код. Всегда считал что должен быть другой выход, на форумах ничего найти не мог подобного ))
@nakamasama
@nakamasama 2 жыл бұрын
@Eugene Я даже расширения ставил. У меня он всё равно все подключаемые библиотеки подчёркивает и кажет, что у меня их нет. Так ошибкой он считает любой метод, который я пытаюсь использовать. Это во-первых. А во-вторых, всё равно ведь нужно открыть Qt и там собирать приложения. В VSCode нет даже расширения для qmake и метаобъектного компилятора Qt, а CMake не решает проблему с тем же метаобъектным компилятором. Так зачем писать код в VSCode потом переключаться на Qt и собирать программу? Легче, когда всё в одном. Теперь, когда я настроил вид и тему Qt, мне будет приятнее им пользоваться. Вот если использовать Qt при написании программ на Питоне, тут всё элементарно. Скачал PyQt через pip и спокойно пишешь себе код. Никаких проблем. У Вас может и работает, не спорю. Но у меня нет.
@nakamasama
@nakamasama 2 жыл бұрын
@Eugene Да. Я ещё раз перечитал. Я неправильно понял. Объясняю. Я Visual Studio не рассматриваю, так как у него нет версии для Линукса. Я разрабатываю программы одновременно для двух систем и на двух системах. Да и лично у меня он (VS) в базовой комплектации занимал больше места, чем Qt, и после запуска требует больше оперативки. У Вас может быть по другому. Почему я сравниваю простой редактор и полноценную IDE? Потому что для написания простых библиотек или консольных приложений на С++ мне достаточно простого редактора кода. И для сборки проектов я пишу собственные makefiles. Мне так удобнее. Для этого мне не нужны мощности Qt. Qt я использую только для написания графических приложения. Также я немного пишу на Питоне. Для него мне с головой хватает возможностей редактора кода. Да, я пляшу с компиляторами и прочая, как Вы пишете. Пускай это не проще, но мне так удобнее. Однако если бы Visual Studio был бы на Линуксе, я бы с радостью им бы пользовался. Так как я пользуюсь обеими системами (такие обстоятельства, по другому пока не могу), мне приходится пользоваться кроссплатформенными решениями. Поэтому я использую и Qt, и VS Code. Всё зависит от поставленных задач и проекта. В любом случае, вопросы "чем пользоваться?" и "как пользоваться?" - это вкусовщина. Каждый останется при своём мнении.
@nakamasama
@nakamasama 2 жыл бұрын
@Eugene Я, кстати вспомнил главную причину, почему я им не хочу пользоваться. Когда VS создаёт проект, там создаётся куча лишних файлов, которые нужны только IDE. В то время, когда нужно написать простую программу, можно создать один или пару файлов проекта и самому его скомпилировать. Указав нужный ключ (-s), конечный экзешник будет весить сотню килобайт, без него программа весит 3 МБ. При написании программ на VS, её нужно сначала как-то настроить, чтобы она компилировала лёгкие экзешники, иначе все будут весить по 3 МБ. Да и в целом он медленнее компилирует. Есть одна вещь в VS, от которой у меня сильно подгарает. Это его отношение к массивам. Точнее, его компилятора. Я просто не могу писать программы с использованием массивов на VS. У него используется свой компилятор MSVS, который я всем своим духом не переношу. Как только я где-то вижу или слышу этот компилятор - меня начинает тошнить. А поменять на свой - НЕЛЬЗЯ! Я пользуюсь компилятором TDM-GCC. Как по мне он самый лучший. Я пользовался большим количеством IDE. Я искал хорошее решение. И все при создании проекта создают кучу лишних не нужных файлов проекту. Они нужны только IDE. Но есть одно исключение - Qt. Только одна эта IDE не создаёт ничего лишнего: только файлы с кодом и .pro-файл (аналог makefile). Вывод: из-за отсутствия кроссплатформенности, создания кучи лишних файлов (не пойми для чего нужных), невозможности изменить компилятор и просто тяжеловесности я не пользуюсь этой IDE и не буду пользоваться. Я передумаю только тогда, когда появится возможность менять компилятор и устанавливать IDE на линукс.
@nakamasama
@nakamasama 2 жыл бұрын
@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 2 жыл бұрын
Привет! Когда ты записуешь данные в массив, я про сервер если что, то можно использовать флаг QIODevice::Truncate. Вместо Data.clear().
Выпадающий список в Qt | combobox
7:00
Программный Кот
Рет қаралды 10 М.
Fast and Furious: New Zealand 🚗
00:29
How Ridiculous
Рет қаралды 43 МЛН
Идеально повторил? Хотите вторую часть?
00:13
⚡️КАН АНДРЕЙ⚡️
Рет қаралды 4,2 МЛН
Как бесплатно замутить iphone 15 pro max
00:59
ЖЕЛЕЗНЫЙ КОРОЛЬ
Рет қаралды 8 МЛН
Как связать окна между собой в Qt | Сигналы и слоты
7:14
Нейросеть простейшими словами | Делаю свою нейросеть
24:16
Налог на незнание JavaScript - [Hamster Kombat]
50:20
Fast and Furious: New Zealand 🚗
00:29
How Ridiculous
Рет қаралды 43 МЛН