Ответы пользователя по тегу Qt
  • Как сделать QAction и QMenu внутри QMenuBar максимальной высоты?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    В общем, лучший вариант, который я нашёл, - это использовать QToolBar вместе с QToolButton, а где нужно меню - использовать метод QToolButton::setMenu(). Смотрится неплохо и, что самое главное, QToolButton - наследник QWidget, в отличии от QAction.
    Ответ написан
    Комментировать
  • Как правильно принимать и передавать данные между классами, реализующими части оконного интерфейса?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    13.07.20
    Пришёл к такому выводу. Если нужно из одних частей оконного интерфейса получать и передавать данные в другие части интерфейса, то лучше это делать через слоты MainWindow (или аналога). А вместо дублирования самих данных, создавать внутри классов, реализующих часть оконного интерфейса, поля-указатели на эти данные, и в конструкторе MainWindow передавать их через геттеры и сеттеры соответствующих классов.

    14.07.20
    Похоже я нашёл способ проще =)
    main.cpp
    #include "parent.hpp"
    
    int main()
    {
        Parent object;
        return 0;
    }
    parent.hpp
    #ifndef PARENT_HPP
    #define PARENT_HPP
    
    #include "child.hpp"
    
    class Parent
    {
        friend class Child;
    
    private:
        Child child{this};
    
    public:
        Parent() = default;
        ~Parent() = default;
    
    private:
        void doNothing() const;
    };
    
    #endif // PARENT_HPP
    child.hpp
    #ifndef CHILD_HPP
    #define CHILD_HPP
    
    class Parent;
    
    class Child
    {
    private:
        Parent *parent;
    
    public:
        Child(Parent *parent);
        ~Child() = default;
    };
    
    #endif // CHILD_HPP
    parent.cpp
    #include "parent.hpp"
    #include <iostream>
    
    void Parent::doNothing() const
    {
        std::clog << "Do nothing!\n" << std::endl;
    }
    child.cpp
    #include "child.hpp"
    #include "parent.hpp"
    
    Child::Child(Parent *_parent) : parent(_parent)
    {
        parent->doNothing();
    }
    Ответ написан
    Комментировать
  • Qt. Почему не получается преобразовать QVideoFrame в QImage?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    Выяснил, что у QVideoFrame есть метод isMapped(), который показывает, размещен ли кадр в ОЗУ (или в виртуальной памяти, т.е. находится ли он в адресуемой памяти и можно ли получить к нему доступ). Оказалось что нет.

    Т.к. сигнал QVideoProbe::videoFrameProbed() передаёт ссылку на константу QVideoFrame, а функция QVideoFrame::map() не константна, то нужно скопировать кадр:

    void MainWindow::proccessFrame(const QVideoFrame &frame)
    {
        QVideoFrame replica = frame;
        replica.map(QAbstractVideoBuffer::ReadOnly);
    
        std::clog << std::boolalpha << frame.isMapped()   << "\n";
        std::clog << std::boolalpha << replica.isMapped() << "\n";
    
        QImage image{ replica.bits(), replica.width(),
                      replica.height(), replica.bytesPerLine(),
                      QVideoFrame::imageFormatFromPixelFormat(replica.pixelFormat()) };
    
        std::clog << replica.width() << " " << replica.height() << "\n";
        std::clog << frame.width()   << " " << frame.height()   << "\n";
        std::clog << image.width()   << " " << image.height()   << "\n";
    
        std::clog << frame.pixelFormat() << "\n";
        std::clog << QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat()) << "\n";
    }
    Ответ написан
    Комментировать
  • Qt. Что такое point в контексте QFont?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    Одна точка (pt) равна 1/72 дюйма. DPI - dots per inch (в данном случае dots == pixels).

    double dpi = QGuiApplication::primaryScreen()->physicalDotsPerInch();
    
    auto pt_to_px = [dpi](double pt) -> double { return pt / 72 * dpi; };
    auto px_to_pt = [dpi](double px) -> double { return px * 72 / dpi; };
    
    std::clog << "12 pt is " << pt_to_px(12) << " px" << std::endl;
    std::clog << "26 px is " << px_to_pt(26) << " pt" << std::endl;
    
    QFont system_font;
    std::clog << "system font size in pt: "
              << system_font.pointSize()
              << "\nsystem font size in px: "
              << pt_to_px(system_font.pointSize()) << std::endl;
    Ответ написан
    Комментировать
  • Как составить регулярное выражение для QString?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    "^\\s*-?[0-9]+\\.?[0-9]*\\s*$"
    Ответ написан
    Комментировать
  • Как прикрепить .so и .h к проекту Qt [qmake][.pro]?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    Присоединил так:
    LIBS += ./muParser/so/libmuparser.so
    
    HEADERS += \
        mainwindow.h \
        ./muParser/h/muParser.h \
        ./muParser/h/muParserBase.h \
        ./muParser/h/muParserBytecode.h \
        ./muParser/h/muParserCallback.h \
        ./muParser/h/muParserDef.h \
        ./muParser/h/muParserDLL.h \
        ./muParser/h/muParserError.h \
        ./muParser/h/muParserFixes.h \
        ./muParser/h/muParserInt.h \
        ./muParser/h/muParserStack.h \
        ./muParser/h/muParserTemplateMagic.h \
        ./muParser/h/muParserTest.h \
        ./muParser/h/muParserToken.h \
        ./muParser/h/muParserTokenReader.h
    Ответ написан
    Комментировать
  • QT в Ubuntu: Как исправить ошибку? :-1: error: cannot find -lGL?

    EgoRusMarch
    @EgoRusMarch
    C++ Developer
    Ответ написан
    Комментировать
  • Как подключить стороннюю библиотеку к проекту Qt через CMake?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    Подключил таким образом:
    • добавил каталог собранной библиотеки в каталог проекта
    • открыл CMakeLists.txt в своём проекте и дописал:
      target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/path_to_include_dir)
      target_link_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/path_to_link_dir)
      target_link_libraries(${PROJECT_NAME} PUBLIC libname)

    Ответ написан
    Комментировать
  • Qt. Как использовать сигналы-слоты?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    Нужно было создавать виджеты нижнего уровня внутри класса виджета верхнего уровня. Версия 2.0:
    main
    #include <QtWidgets>
    #include "widget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication ThisApp(argc,argv);
    
        Widget ConverterWeights;
        ConverterWeights.show();
    
        return ThisApp.exec();
    }

    widget.h
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QtWidgets>
    
    class Widget : public QWidget
    {
    Q_OBJECT
    
    public:
        QLabel      *Title;
        QLineEdit   *Input;
        QLineEdit   *Output;
        QComboBox   *UnitWI;
        QComboBox   *UnitWO;
        QPushButton *Button;
    
    public:
        Widget() : QWidget()
        {
            Title   = new QLabel(this);
            Input   = new QLineEdit(this);
            Output  = new QLineEdit(this);
            UnitWI  = new QComboBox(this);
            UnitWO  = new QComboBox(this);
            Button  = new QPushButton(this);
    
            ConfigBase();
            ConfigTitle();
            ConfigInput();
            ConfigOutput();
            ConfigUnitWI();
            ConfigUnitWO();
            ConfigButton();
    
            QObject::connect(Button,SIGNAL(clicked(bool)),this,SLOT(PushButton()));
        }
        ~Widget() {}
    
    private:
        void ConfigBase();
        void ConfigTitle();
        void ConfigInput();
        void ConfigOutput();
        void ConfigUnitWI();
        void ConfigUnitWO();
        void ConfigButton();
    
    public slots:
        void PushButton()
        {
            /*code*/
        }
    };
    
    #endif
    Ответ написан
  • Qt. Как создать с инициализацией объект класса с членами-объектами на стеке?

    EgoRusMarch
    @EgoRusMarch Автор вопроса
    C++ Developer
    Решил. Создаем объекты:
    QLabel      Title;
    QLineEdit   Input;
    QLineEdit   Output;
    QComboBox   UnitWI;
    QComboBox   UnitWO;
    QPushButton Button;

    и затем устанавливаем родителя методом setParent().

    Но как оказалось, выделение памяти на стеке для виджетов - очень плохая затея.
    Связанно это с переполнением стека и с тем, что при создании нескольких несвязанных иерархией виджетов приведет к ошибке (исключению).
    Ответ написан
    Комментировать