A
Alex_ShapranШілде 30, 2018, 7:08 Т.Ж.

Стандартная рамка окна в Qt

Qt, стандартная рамка окна, WinApi

Как изменить цвет стандартной рамки окна в Qt? Или как убрать с рамки все стандартные кнопки и поместить туда свой layout со своими кнопками и своим стилем?
Данный вопрос возник из-за того, что, если у окна отключена рамка полностью с помощью this->setWindowFlags(Qt::FramelessWindowHint); и в этом окне проигрывается видео (используется QVideoWidget, который помещается в gridlayout, и QMediaPlayer для самого воспроизведения видео и звука), то все контроллы для перемотки видео, изменения громкости не работают, также не работают все стили для кнопок (точнее первоначальный стиль кнопок раотатет, а вот стили прописанные для наведения отключаются), сами кнопки работают.
Если же использовать this->setWindowFlags(Qt::CustomizeWindowHint); то все прекрасно работает, но в Windows 8 появляется ужасная толстая стандартая рамка, а в Windoes 10 рамка сама почти не видна, а вот верхняя часть, где располагаются обычно стандартные кнопки и заголовок окна, остается без этих кнопок, заголовка, и в итоге видна просто жирная белая линия.
Во многих современных приложениях есть свои рамки со своими кнопками закрытия окна и т.п. Например, в Discord, Photoshop или isual Studio (Пример на фото).
Читал в интернете, что изменить цвет стандартной рамки можно через WinApi, но как это сделать не разобрался, тем более, как это реализовать в Qt.
Заранее спасибо:)

example.jpg
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

12
Evgenii Legotckoi
  • Шілде 30, 2018, 7:14 Т.Ж.

Добрый день!

Вот в этой статье есть подробный пример , как это сделать средствами самого Qt.
Смысл заключается в отключении системного оформления и написания собственного.

    A
    • Шілде 30, 2018, 7:15 Т.Ж.

    Я как раз по этой статье делал:)
    Сейчас подробнее разберусь, может, что-то не учел

      A
      • Шілде 30, 2018, 7:23 Т.Ж.

      Со стилями разобрался а с контроллерами нет
      Вот, например, есть контроллы для плеера:

      connect(player, &QMediaPlayer::volumeChanged, this, &Video_window_widget::on_volume_changed);
      connect(player, &QMediaPlayer::durationChanged, this, &Video_window_widget::on_duration_changed);
      connect(player, &QMediaPlayer::positionChanged, this, &Video_window_widget::on_duration_changing);
      connect(player, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(mediaPlayerError(QMediaPlayer::Error)));

      Но они, похоже, не работают. Либо они работают, но из-за отключения рамки не показывается изменение позиции на слайдере
      Как это можно исправить?



        Evgenii Legotckoi
        • Шілде 30, 2018, 7:36 Т.Ж.

        То есть это то, что Вы уже самостоятельно дописали? Вы добавляли те слоты on_volume_changed и т.д. через Qt Designer?

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


        Например, в Qt Creator есть пример под названием Media Player Example. У него есть слайдер. Посмотрите, работает ли у него слайдер. Если не работает, то это баг. Периодически возникает такая проблема у всех и периодически вопросы задают...
        В итоге переходят на использование  библиотеки Bass.dll :)))

          A
          • Шілде 30, 2018, 7:43 Т.Ж.

          Слоты добавлял вручную, то есть прописывал кодом все. Вот нашел этот пример и запустил с отключенной рамкой, все работает в примере. Сейчас буду разбираться в чем у меня проблема.
          Спасибо большое!)

            Evgenii Legotckoi
            • Шілде 30, 2018, 7:46 Т.Ж.

            скорее всего сигнал/слотовое соединение не подключается исправно. Реализацию слотов прописали же?

              A
              • Шілде 30, 2018, 7:55 Т.Ж.

              В заголовочном файле:

              public slots:
                  void on_duration_changed(qint64 position);
                  void on_duration_changing(qint64 position);
              
              private slots:
              
              void on_volume_changed(qint64 position);

              В файле реализации, например:

              void Video_window_widget::on_duration_changed(qint64 position)
              {
                  video_position = position;
                  ui->horizontalSlider->setMaximum(position);
                  QJsonObject obj = video_window_parent->videos[video_window_parent->get_list_widget()->currentRow()].toObject();
                  unsigned int duration = + obj["duration"].toInt();
                  unsigned int minutes = duration / 60;
                  unsigned int seconds = duration - ( minutes * 60 );
                  ui->lineEdit_5->setText("-" + QString::number(minutes) + ":" + QString::number(seconds));
              }

              Я, кажется, понял, в чем проблема еще может быть, эти слоты я прописывал в ручную, и коннекты для них писал, а вот слоты для работы со слайдерами как раз в дизайнере сделал. Вот например есть слот void on_horizontalSlider_sliderMoved(int position);  и реализация, а коннекта на него не написано

              Может, в этом проблема?
               
               
                Evgenii Legotckoi
                • Шілде 30, 2018, 7:59 Т.Ж.

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


                Добавьте в реализацию слота вывод qDebug()
                например так
                void Video_window_widget::on_duration_changed(qint64 position)
                {
                    qDebug() << "position" << position;
                    video_position = position;
                    ui->horizontalSlider->setMaximum(position);
                    QJsonObject obj = video_window_parent->videos[video_window_parent->get_list_widget()->currentRow()].toObject();
                    unsigned int duration = + obj["duration"].toInt();
                    unsigned int minutes = duration / 60;
                    unsigned int seconds = duration - ( minutes * 60 );
                    ui->lineEdit_5->setText("-" + QString::number(minutes) + ":" + QString::number(seconds));
                }

                И посмотрите в консоли, есть вывод дебага или нет. Если нет, значит коннект нерабочий.
                Не забудьте только подключить заголовочник qDebug
                #include <QDebug>




                  A
                  • Шілде 30, 2018, 8:08 Т.Ж.

                  QMetaObject::connectSlotsByName: No matching signal for on_duration_changed(qlonglong)

                  QMetaObject::connectSlotsByName: No matching signal for on_duration_changing(qlonglong)

                  QMetaObject::connectSlotsByName: No matching signal for on_volume_changed(qlonglong)

                  POSITION = 1121315
                  Вот вывод в дебаге, позиция выводится, но вот те сообщения о No matching signal for не знаю, что означают

                  Эти сообщения выводились и прежде без отключения рамки, но тогда все работало



                    Evgenii Legotckoi
                    • Шілде 30, 2018, 8:16 Т.Ж.
                    • (өңделген)
                    • Жауап шешім ретінде белгіленді.

                    подключение по имени, вы что-то видимо поменяли в имени слота. Раньше было нормальное подключение, а потом слетело.

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

                      A
                      • Шілде 30, 2018, 8:40 Т.Ж.

                      Помогло! Спасибо еще раз!)
                      И если на будущее, возможно ли действительно сменить цвет рамки окна в Qt?

                        Evgenii Legotckoi
                        • Шілде 30, 2018, 9:20 Т.Ж.

                        Думаю, что да, но через WinAPI, относительно редактирования внешнего вида окон, я как-то не занимался этим, необходимости не было. Но что касается кое-какого другого функционала, то можно работать с WinAPI, просто некоторые event фильтры настраивать приходится и т.д.

                          Пікірлер

                          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                          Кіріңіз немесе Тіркеліңіз
                          AD

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:50ұпай,
                          • Бағалау ұпайлары-4
                          m
                          • molni99
                          • Қаз. 26, 2024, 11:37 Т.Ж.

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:80ұпай,
                          • Бағалау ұпайлары4
                          m
                          • molni99
                          • Қаз. 26, 2024, 11:29 Т.Ж.

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Нәтиже:20ұпай,
                          • Бағалау ұпайлары-10
                          Соңғы пікірлер
                          ИМ
                          Игорь МаксимовҚар. 22, 2024, 10:51 Т.Қ.
                          Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii LegotckoiҚар. 1, 2024, 12:37 Т.Ж.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZEҚаз. 19, 2024, 6:19 Т.Қ.
                          Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь МаксимовҚаз. 5, 2024, 5:51 Т.Қ.
                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas5Шілде 5, 2024, 9:02 Т.Қ.
                          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Енді форумда талқылаңыз
                          m
                          moogoҚар. 22, 2024, 6:17 Т.Қ.
                          Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                          Evgenii Legotckoi
                          Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey1Қар. 15, 2024, 5:04 Т.Қ.
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProjectМаусым 4, 2022, 1:49 Т.Қ.
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                          Бізді әлеуметтік желілерде бақылаңыз