Стандартная рамка окна в 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.
Заранее спасибо:)
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Akiv Doros
- 11 ноября 2024 г. 22:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
- molni99
- 26 октября 2024 г. 8:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
- molni99
- 26 октября 2024 г. 8:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Добрый день!
Я как раз по этой статье делал:)
Сейчас подробнее разберусь, может, что-то не учел
Со стилями разобрался а с контроллерами нет
Вот, например, есть контроллы для плеера:
Но они, похоже, не работают. Либо они работают, но из-за отключения рамки не показывается изменение позиции на слайдере
Как это можно исправить?
То есть это то, что Вы уже самостоятельно дописали? Вы добавляли те слоты on_volume_changed и т.д. через Qt Designer?
Например, в Qt Creator есть пример под названием Media Player Example. У него есть слайдер. Посмотрите, работает ли у него слайдер. Если не работает, то это баг. Периодически возникает такая проблема у всех и периодически вопросы задают...
Слоты добавлял вручную, то есть прописывал кодом все. Вот нашел этот пример и запустил с отключенной рамкой, все работает в примере. Сейчас буду разбираться в чем у меня проблема.
Спасибо большое!)
скорее всего сигнал/слотовое соединение не подключается исправно. Реализацию слотов прописали же?
В заголовочном файле:
В файле реализации, например:
Я, кажется, понял, в чем проблема еще может быть, эти слоты я прописывал в ручную, и коннекты для них писал, а вот слоты для работы со слайдерами как раз в дизайнере сделал. Вот например есть слот void on_horizontalSlider_sliderMoved(int position); и реализация, а коннекта на него не написано
Если слот добавлен через дизайнер, то в автоматически генерируемом коде коннект будет и всё будет работать, но если вы изменили имя слота или его сигнатуру потом вручную, то конечно уже работать не будет.
И посмотрите в консоли, есть вывод дебага или нет. Если нет, значит коннект нерабочий.
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 не знаю, что означают
Эти сообщения выводились и прежде без отключения рамки, но тогда все работало
подключение по имени, вы что-то видимо поменяли в имени слота. Раньше было нормальное подключение, а потом слетело.
Помогло! Спасибо еще раз!)
И если на будущее, возможно ли действительно сменить цвет рамки окна в Qt?
Думаю, что да, но через WinAPI, относительно редактирования внешнего вида окон, я как-то не занимался этим, необходимости не было. Но что касается кое-какого другого функционала, то можно работать с WinAPI, просто некоторые event фильтры настраивать приходится и т.д.