A
Alex_Shapran30 июля 2018 г. 17: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 г. 17:14

Добрый день!

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

    A
    • 30 июля 2018 г. 17:15

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

      A
      • 30 июля 2018 г. 17: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 г. 17:36

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

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


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

          A
          • 30 июля 2018 г. 17:43

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

            Evgenii Legotckoi
            • 30 июля 2018 г. 17:46

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

              A
              • 30 июля 2018 г. 17: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 г. 17: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 г. 18: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 г. 18:16
                    • (ред.)
                    • Ответ был помечен как решение.

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

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

                      A
                      • 30 июля 2018 г. 18:40

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

                        Evgenii Legotckoi
                        • 30 июля 2018 г. 19:20

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

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          Ua

                          Qt - Тест 001. Сигналы и слоты

                          • Результат:84баллов,
                          • Очки рейтинга4
                          Ua

                          Qt - Тест 001. Сигналы и слоты

                          • Результат:42баллов,
                          • Очки рейтинга-8
                          ОК

                          Qt - Тест 001. Сигналы и слоты

                          • Результат:47баллов,
                          • Очки рейтинга-6
                          Последние комментарии
                          ИМ
                          Игорь Максимов22 ноября 2024 г. 21:51
                          Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii Legotckoi31 октября 2024 г. 23:37
                          Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZE19 октября 2024 г. 17:19
                          Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов5 октября 2024 г. 16:51
                          Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas55 июля 2024 г. 20:02
                          QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Сейчас обсуждают на форуме
                          f
                          firstlunoxod15 февраля 2025 г. 13:46
                          Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                          Дмитрий
                          Дмитрий3 февраля 2025 г. 16:24
                          Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                          NW
                          Nayo Wai30 января 2025 г. 19:22
                          не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                          n
                          nkly3 января 2025 г. 12:52
                          Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                          M
                          Marsel17 августа 2023 г. 0:26
                          OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                          Следите за нами в социальных сетях