Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
17 октября 2018 г. 16:33

Работа с WinAPI в QT(изменение title bar)

qt, WinAPI, titlebar

Здравствуйте. Я хочу в своей программе изменить цвет title bar. Так как в qt нет не каких функций связаных с этим я искал в интернете ответ на мой вопрос и там советовали функцию SetSysColors().  Но у меня по каким-то непонятным не работает данная функция. Возможно кто-то знает как решить данную проблему. И еще. Если юзать setWindowFlags(Qt::FramelessWindowHint) , то исчезают границы для изменения размера окна. Можно ли как то юзать этот флаг но вернуть эти границы либо используя  setWindowFlags(Qt::CustomizeWindowHint) закрасить title bar(как на скрине)


9

По поводу границ изменения окна с Qt::FramelessWindowHint можете посмотреть вот эту статью

Я там описывал пример подобной кастомизации, чтобы ещё и размеры изменять, а по поводу WinAPI, я не уверен, что это будет наиболее подходящий подход, во-первых трудно будет докопаться до этой чвсти через WinAPI, а во вторых некроссплатформенно будет, если не заюзаете идиому Pimpl , но это несколько сложнее будет. На данный момент, как мне кажется вам это не нужно.

Но если мысли какие-то будут по поводу SetSysColors я напишу, если честно, лично я не использовал это.


Для Django рекомендую VDS-хостинг TIMEWEB

0

Хорошо, я попробуй по вашей статье.

0

Попробовал я по статье. Оно хоть и работает но с багами). Особенно когда выделил на QGraphicsScene предмет и уводишь просто курсор за границы программы то программа скачет за курсором куда-то. Единственный вариант это изменить цвет titlebar. Но как мало кто знает.

А курсор скачет из-за этой строчки : this->setMouseTracking(true);

А если ее убрать то не будет работать изменение размера окна.






0

Ну если честно, когда я запустил ваш пример у себя первый раз, вообще можно сказать, что ничего не работало )))

Тот пример базовый, естественно, что в некоторых случаях что-то может не работать, нужно отслеживать такие случаи и исправлять ситуацию, возможно требуется где-то запретить некоторый функционал по отслеживанию движения мыши, а где-то переработаь

Для Django рекомендую VDS-хостинг TIMEWEB

0

Лол а что у меня не работало?) Просто я работаю в команде и у всех все работает). Запретить флаг по перемещению или выделению итема на сцене? А Вы так и не нашли способ изменения цвета title bar?

0

Ну когда я это дело запустил под Kde Neon вело себя это дело достаточно неадекватно и регулярно крашилось при попытке создания объектов графика очевидно... Я не стал особо заморачиваться, поскольку решил, что вы всё-таки не на всех платформах тестируете.

Насчёт title bar - нет, да и некогда было, у меня сейчас на повестке дня рефакторинг сайта, да и модуль дописываю ))


Для Django рекомендую VDS-хостинг TIMEWEB

0

Кароче, я сам сделал изменение размера). Чуть помучался, но за то все нормально работает. Если хотите код могу скинуть.

0

Почему бы и нет)) Можете приложить к сообщению ту часть кода ))

Для Django рекомендую VDS-хостинг TIMEWEB

0
  • Ответ был помечен как решение.
  • 23 октября 2018 г. 10:42
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->pos().y() <= 45 && event->pos().y() >= 16)
        mpos = event->pos();
    else if(event->pos().y() <= 15)
    {
        numberr = 1;
        respos = event->pos();
    }
    else if(event->pos().x() <=15)
    {
        numberr = 2;
        respos = event->pos();
    }
    else if(event->pos().x() >= (this->width() - 15))
    {
        numberr = 3;
        respos = event->pos();
    }
    else if(event->pos().y() >= (this->height() - 15))
    {
        numberr = 4;
        respos = event->pos();
    }
    initpos = event->pos();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (mpos.x() >= 0 && event->buttons() && Qt::LeftButton)
    {
        QPoint diff = event->pos() - mpos;
        QPoint newpos = this->pos() + diff;
        this->move(newpos);
    }
    else if(respos.x() >= 0 && event->buttons() && Qt::LeftButton)
    {
        QPoint diff = event->pos() - respos;
        if(numberr == 3 || numberr == 4)
        {
            respos = event->pos();
            this->setGeometry(this->x(), this->y(), respos.x(), respos.y());
        }
        else if(numberr == 2)
        {
            int widt = this->width()-diff.x();
            if(widt <= this->minimumWidth())
                return;
            else
                this->setGeometry(this->x()+diff.x(), this->y(),widt,this->height());
        }
        else if(numberr == 1)
        {
            int heigh = this->height()-diff.y();
            if(heigh <= this->minimumHeight())
                return;
            else
                this->setGeometry(this->x(), this->y()+diff.y(),this->width(),this->height()-diff.y());
        }
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *)
{
    mpos = QPoint(-1, -1);
    respos = QPoint(-1, -1);
    initpos = QPoint(-1,-1);
}
//Переменные из класса
QPoint mpos = QPoint(-1, -1);
QPoint respos = QPoint(-1,-1);
QPoint initpos = QPoint(-1,-1);
int numberr = 0;
2

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
16 ноября 2018 г. 19:09
Илья Завьялов

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

  • Результат:31баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 12:49
Ирина Минигузина

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 8:55
Vitaliy

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

  • Результат:52баллов,
  • Очки рейтинга-4
Последние комментарии
16 ноября 2018 г. 6:50
Евгений Легоцкой

Добрый день! шаблон не находит, или шаблон неправильно прописали, или тег шаблона неправильно написан, иных выводов сделать не могу, из того, что вы написали. трейсбек нужно смотреть. Со...
16 ноября 2018 г. 6:48
Евгений Легоцкой

пройтись циклом по всем виджетам в обратном порядке for (int i = ui->vertialLayout->count() - 1; i >= 0; --i){ QWidget* w = ui->verticalLyout->itemAt(i)->widget();...
15 ноября 2018 г. 21:35
chunk

Доброго времени суток Евгений. Не подскажете что я делаю не так? Получаю ошибку такого характера: Reverse for 'add_comment' with arguments '('',)' not found. 1 pattern(s) tried: ...
15 ноября 2018 г. 15:35
Михаиллл

Спасибо. Похоже где то описку сделал, поэтому не работало. Я добавил на verticalLayout много виджитов. А можно ли их как то быстро и просто удалить?
15 ноября 2018 г. 14:55
Евгений Легоцкой

verticalLayout - это, по-моему предположению, должен быть у вас объект класса QVBoxLayout, который наследован от QBoxLayout. Поэтому открываете документацию на QVBoxLayout ...
Сейчас обсуждают на форуме
17 ноября 2018 г. 23:20
Евгений Легоцкой

Три года назад я подключал ffmpeg в проект на Qt/С++ на первой работе. И кодирование декодирование удалось запустить. Подключал как библиотеку. Думаю, что в зависимости от проекта мо...
17 ноября 2018 г. 14:13
Чарльз Грин

Я сейчас занимаюсь мультимедией, это аудио и видео, программы для концертов и т. д. Бибилиотека Qt очень помогает, она надежная, а надежность в моих приложениях очень важный фактор чтоб не пол...
16 ноября 2018 г. 16:28
Евгений Легоцкой

Добрый день! Спасибо, что воспользовались именно форумом. Заниматься курсовыми работами чьими-то ни было у меня времени нет, у самого полторы работы. Но что-то подсказать на фо...
16 ноября 2018 г. 9:52
Евгений Легоцкой

Отладчик!!!! Версия комплекта MSVC 2015 + компилятор 14.0!!!!
Присоединяйтесь к нам в социальных сетях

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