Ответы пользователя по тегу Qt
  • Как подключить qt к cmake?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Во-первых поставьте системную Qt (погуглилте как это в вашем линуксе сделать), для вас это будет намного проще, чем собрать Qt самостоятельно и сделать все то, что CLion написала вам в лог.
    Во-вторых CMakeLists должен быть примерно таким (ну инклюды там свои пропишите и пр.):
    cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
    
    project(Foo)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} -std=c++1y")
    
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    find_package(Qt5Widgets REQUIRED)
    
    include_directories(${Qt5Widgets_INCLUDES})
    add_executable(Foo main.cpp)
    qt5_use_modules(Foo Widgets Core)

    Но зачем вам страдать с CLion, которая под разработку на Qt вообще не заточена? Не лучше ли взять нормальную IDE вроде QtCreator и не страдать?
    Ответ написан
    Комментировать
  • Как сделать try finally в С++?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Нет, т.к. в C++ finally нету по стандарту, а значит сахар от MS и CB непереносим т.ч. мой совет, не пользоваться им. Обычного try-catch за глаза хватит, т.ч. почитайте как этим пользоваться просто, тут например: www.cplusplus.com/doc/tutorial/exceptions
    Ответ написан
    7 комментариев
  • Где смотреть конструктор класса?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Без понимания ООП в C++, хотя бы основ, в мире Qt делать вообще нечего. Нет знаний ООП и базовых знаний языка -- не осовите вы Qt никогда.
    Я думаю, что где-то в книге Шлее написано что вы должны понимать ООП, хотя не уверен. Так-то и книга не нужна: примеры + документаций + форумы -- это достаточно.

    Отвечая на ваш вопрос, методы тут можно посмотреть: https://doc.qt.io/qt-5/qwidget.html .
    Ответ написан
    Комментировать
  • Почему Qt Creator не видит методы элементов std::vector?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Довольно странно. А проект компилируется?
    В любом случае, проверьте Options->Build & Run->Kits/Compilers/Qt Versions. И все пути.

    PS
    А модель код меняется на вкладке Options->C++->Code Model. Только сомневаюсь что у вас клэнг установлен и все пути прописаны, или что там на виндах надо сделать.
    Ответ написан
  • Qt. Как передавать данные между формами?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    На самом деле вам не нужно ничего и никуда передавать, как мне кажется. Т.к. вторая форма используется только для создания новых элементов. Но обо всём по порядку. В приведённом фрагменте кода я вижу несколько архитектурных проблем (если не интересно, можете игнорироваться все, кроме пункта 3):
    1) Вторая форма создаётся каждый раз, когда пользователь кликает на кнопку add_item. Это утечка памяти, т.к. все формы будут удалены только после удаления главного окна, но не ранее. Почему бы не создать форму один раз и просто её не показывать на действие? Создали в классе поле QScopedPointer m_addItemDlg (ну или std::unique_ptr), один раз выделили память в конструкторе и радуетесь жизни.
    2) Это не очень хорошо, что Institution хранится в контейнере QList по значению т.к., скорее всего вы не реализовали семантику перемещения и всё это копируется... Хотя бы по этой причине (и по многим другим) стоит подумать о том, чтобы хранить все элементы как shared_ptr.
    3) Наконец-то мы добрались и до вашего вопроса! В Qt есть отличный механизм слотов и сигналов. В вашем случае идея проста: у главной формы надо реализовать слот onInstitutionAdded а у второй формы дописать сигнал institutionAdded и соединить их в конструкторе главной формы. Когда новый объект создан выслать сигнал из второй формы и в слоте главного окна реализовать добавление в коллецию.
    Если же нужно будет редактировать какой-то итем в коллекции, то его конечно лучше передать просто по ссылке перед тем как показать форму. Ну и в этом случае посмотреть уже в сторону Qt model-view.
    4) Название класса второй формы слишком общее и ни о чем не говорит.
    Ответ написан
    2 комментария
  • Qt. Как сериализовать объекты содержащие коллекции?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Для сереализации в Qt есть специальный класс QDataStream. У классов которые вы хотите сереализовать нужно реализовать два оператора (для чтения и для записи):
    QDataStream &operator<< (QDataStream &out, const T &obj);
    QDataStream &operator>> (QDataStream &in, T &obj);
    
    QFile f("path");
    if (f.open(QIODevice::ReadOnly) { // or WriteOnly, or ReadWrite
       QDataStream s(&f);
       T obj;
       s >> obj; // for write s << obj
    }

    Но у вас в коллециях указатели, т.ч. сереализоваться будут адреса, а не сами объекты. Эту проблему нужно как-то решить, т.е. если у вас QList<Institution> lst, то можно просто написатьs << lstдля сереализации, а если указатель, то нет, возможно написать соотвествующий оператор для указателя -- это решение.

    А еще возможно стоит присмотреться к JSON (с пятой версии поддержка входит в стандартную библиотеку Qt) если нужно именно сохранять в файлы, потом читать и иметь возможность поправить руками.

    PS код писал просто по памяти, поэтому может не скомпилироваться :) Но примерно дела обстоят так.
    PPS и лучше используйте какие-нибудь умные указатели вроде QSharedPointer, boost::shared_ptr или std::shared_ptr (с C++11)... Голые указатели уже моветон.
    Ответ написан
    1 комментарий
  • QML vs QtWidgets?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Это зависит от того, какие конкретно приложения вам нужно писать. Если это что-то под сенсорный дисплей, то выбор однозначен (QML), если под десктоп и это еще одна бухгалтерская программа, т.е. нет много 3D, работы с QGraphicsScene или OpenGL, то использовать QML будет приятнее чем классические виджеты -- писать проще и быстрее, но пока не освоитесь будете плеваться и хотеть бросить :)
    А так-то посмотрите, например на hh.ru процент вакансий где требуется Qt и именно QML, думаю, что стандартные виджеты еще долго жить будут.
    Ответ написан
    7 комментариев
  • Как установить иконку на qpushbutton?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Вам нужно проверить (в следующем порядке):
    1) Действительно ли активируется слот, если нет, то вызвать qmake.
    2) Попробовать полный путь до иконки, если сработает, то файл у вас лежит не рядом с исполняемым файлом и его нужно переложить.

    А глобально, откройте для себя файлы *.ui (просто создайте проект Qt Widgets Application) и файлы ресурсов. В вашем примере я не вижу ничего такого чтобы потребовало писать код руками а не накидать GUI в визуальном редакторе.
    Ответ написан
    Комментировать
  • Кроссплатформенность c++ -> Qt\c++, c++\CLI?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Qt -- кроссплатформенная библиотека. Зачем делать что-то своё, если все уже сделали за вас? Представьте, что вам внезапно захотелось портировать приложение еще и на Mac... Будете снова делать свои классы кроссплатформенными, или просто напишите один раз на Qt и это будет работать везде и одинаково в 95% случаев? Выбор за вами в общем.
    Ответ написан
  • Как нарисовать сглаженную линию с размытием в Qt на iOS?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Если я не ошибаюсь, то у них есть этот баг в трекере уже.
    Так что, наверно только фикса ждать или самому пропатчить Qt ;)
    Ответ написан
  • Почему вываливается segmentation fault в qtreewidget?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    currentItem() может вернуть null, скорее всего в этом проблема.
    Ответ написан
    Комментировать
  • На чем лучше писать программы под Windows?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Однозначно Qt. Обратите внимание на QML. Eсли знаете JS и CSS, то порог вхождения будет минимальным.
    Ответ написан
    Комментировать
  • Как правильно составить функцию qHash для объекта содержащего два QString? Или просто какой алгоритм для хеширования двух строк?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Возьмите хэш от каждой строки и сделайте xor. Ну если строки одинаковые, то xor не делайте.
    А еще можно посмотреть в сторону boost hash, например.
    Ответ написан
    Комментировать
  • Вопрос по C# и net framework?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    В плане языка, C++ и C# разные языки разного назначения и используются для программ разного типа. Т.е., как вам уже отвечали, необходимо определиться с тем, что вы хотите писать.
    От себя рекомендую следующее (есди выберите Qt): использовать Qt 5.x, gcc5, с++14 и обязательно посмотрите в сторону QML.
    Ответ написан
    Комментировать
  • Как соединить сигнал с "неизвестными" аргументами со слотом в Qt?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Посмотрите в сторону мета системы Qt, в частности на QMetaMethod (как соединять, как получать список параметров и пр.).
    Ну и конечно же главный вопрос: какую задачу вы пытаетесь решить подобным образом? Возможно, это не совсем то что вам нужно)
    Ответ написан
  • Как записать значение QLineEdit в переменную?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    void Autorization::on_autorisOK_clicked()
    {
        QString userName = ui->autorizUser->text();
        QString userPass = ui->autorizPass->text();
    }

    Совет: сначала разобраться хотя бы с основами ООП в С++, а потом уже начинать работать с Qt.
    Ответ написан
  • Как отобразить несколько графиков QwtPlotCurve?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Я не работал с этим компонентом, но скорее всего проблема в том, что replot() необходимо вызывать после каждого добавления новой кривой или вызвать setAutoReplot(true) у QwtPlot после создания объекта (хотя, вероятно первый вариант лучше).
    Ответ написан
  • В чем причина ошибок при компиляции?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Там в логе написано после красненького кружочка, что вы в конст методе пытаетесь дернуть не конст методы, которые могут изменить внутреннее состояние объекта. Т.е. все геттеры должны быть конст.

    Подсказка: подумать, если не получилось, открыть гугл, скопировать описание ошибки, почитать на stackoverflow как решить схожую проблему, решить.
    Ответ написан
  • Как очистить QListWidget при нажатии на клавишу?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Телепаты в отпуске. Код в студию. Слот clear удаляет все элементы, вероятно вы где-то что-то сделали не так.
    Ответ написан