Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
A
30 июля 2018 г. 11: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.
Заранее спасибо:)

12

Добрый день!

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

0
A

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

0
A

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

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)));

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



0

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

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


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

0
A

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

0

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

0
A

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

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);  и реализация, а коннекта на него не написано

Может, в этом проблема?
 
 
0

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


Добавьте в реализацию слота вывод 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>




0
A

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 не знаю, что означают

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



0

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

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

0
A

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

0

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
КА
19 февраля 2019 г. 18:32
Кристина Афанасьева

C++ - Тест 006. Перечисления

  • Результат:70баллов,
  • Очки рейтинга1
КА
19 февраля 2019 г. 18:26
Кристина Афанасьева

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

  • Результат:60баллов,
  • Очки рейтинга-1
КА
19 февраля 2019 г. 18:00
Кристина Афанасьева

C++ - Тест 002. Константы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
21 февраля 2019 г. 12:51
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
21 февраля 2019 г. 12:29
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
21 февраля 2019 г. 12:08
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
21 февраля 2019 г. 12:04
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
21 февраля 2019 г. 11:54
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Сейчас обсуждают на форуме
21 февраля 2019 г. 8:58
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
20 февраля 2019 г. 21:55
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
20 февраля 2019 г. 15:06
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
20 февраля 2019 г. 14:40
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
20 февраля 2019 г. 10:34
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы