A
Alex_ShapranJuly 30, 2018, 5:08 p.m.

Стандартная рамка окна в 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
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

12
Evgenii Legotckoi
  • July 30, 2018, 5:14 p.m.

Добрый день!

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

    A
    • July 30, 2018, 5:15 p.m.

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

      A
      • July 30, 2018, 5:23 p.m.

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

      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
        • July 30, 2018, 5:36 p.m.

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

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


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

          A
          • July 30, 2018, 5:43 p.m.

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

            Evgenii Legotckoi
            • July 30, 2018, 5:46 p.m.

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

              A
              • July 30, 2018, 5:55 p.m.

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

              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
                • July 30, 2018, 5:59 p.m.

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


                Добавьте в реализацию слота вывод 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
                  • July 30, 2018, 6:08 p.m.

                  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
                    • July 30, 2018, 6:16 p.m.
                    • (edited)
                    • The answer was marked as a solution.

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

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

                      A
                      • July 30, 2018, 6:40 p.m.

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

                        Evgenii Legotckoi
                        • July 30, 2018, 7:20 p.m.

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

                          Comments

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          Ua

                          Qt - Test 001. Signals and slots

                          • Result:84points,
                          • Rating points4
                          Ua

                          Qt - Test 001. Signals and slots

                          • Result:42points,
                          • Rating points-8
                          ОК

                          Qt - Test 001. Signals and slots

                          • Result:47points,
                          • Rating points-6
                          Last comments
                          ИМ
                          Игорь МаксимовNov. 22, 2024, 9:51 p.m.
                          Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
                          Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZEOct. 19, 2024, 5:19 p.m.
                          Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь МаксимовOct. 5, 2024, 4:51 p.m.
                          Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas5July 5, 2024, 8:02 p.m.
                          QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Now discuss on the forum
                          f
                          firstlunoxodFeb. 15, 2025, 1:46 p.m.
                          Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                          Дмитрий
                          ДмитрийFeb. 3, 2025, 4:24 p.m.
                          Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                          NW
                          Nayo WaiJan. 30, 2025, 7:22 p.m.
                          не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                          n
                          nklyJan. 3, 2025, 12:52 p.m.
                          Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                          M
                          MarselAug. 17, 2023, 12:26 a.m.
                          OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                          Follow us in social networks