A.
Allyans .Oct. 17, 2018, 12:33 p.m.

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

qt, WinAPI, titlebar

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


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.
9

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

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

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


A.

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

A.

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

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

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






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

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

A.

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

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

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


A.

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

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

A.
  • Oct. 23, 2018, 6:42 a.m.
  • The answer was marked as a solution.
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;

Comments

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

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
TG

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
TG

C++ - Test 001. The first program and data types

  • Result:60points,
  • Rating points-1
TN

C++ - Test 001. The first program and data types

  • Result:40points,
  • Rating points-8
Last comments
t
  • t1m4
  • Jan. 23, 2021, 8:28 a.m.

Django - Tutorial 052. Redefining a User Model

Добрый день, Я вот написал в admin.py admin.site.register(User, UserAdmin) Но у меня не появилось новые поля в админке?

Django - Tutorial 001. Deploying a site on Django + PostgreSQL + Gunicorn + Nginx

Ошибка в конфиге инжинкса про статику в root последний слеш лишний путь в таком виде получается /home/user/myprojectenv/myproject/myproject//static
  • Jurij
  • Jan. 20, 2021, 1:34 p.m.

Qt/C++ - Lesson 061. Adding images to the application using the Drag And Drop method from the file manager

// Вместо отрисовки иконки и текста будем отрисовывать только одно изображение // с небольшими отступами в 5 пикселей QPixmap pix(m_model->data(index).toString()); …
m
  • magrif
  • Jan. 19, 2021, 12:37 p.m.

Qt Сертификация

Здравствуйте. Подскажите, оплачивать ваучер прямо в выбранном тестовом центре? Можно ли загранник предъявить? Или свой паспорт, а заполнить транслитом? А то там пишут: Your name must exactl…
r
  • retmas
  • Jan. 17, 2021, 4:09 a.m.

Qt/C++ - Tutorial 074. Generating pseudo-random numbers, using STD library random

Дмитрий, решает. Просто автор, видимо, не сильно озаботился изучением документации QRandomGenerator. Да и в листинге с использованием qrand вызов функции qsrand на каждой итерации цикла нав…
Now discuss on the forum
D

QScrollArea dynamically add QCheckBoxes

Привет всем участникам! Класный у вас сайт! Нашёл познавательное в сети: «Марш достоинства»: тысячи испанцев требуют социальной справедливости http://electek.ru/news/11182-marsh-dostoinstva…

Не получается prefetch_related на M2M полях

это да. и правильнее всего было бы сделать все фильтрации и только в самом конце вызвать prefetch_related например, если все это уходит в шаблон, я бы поступил следующим образом: def so…
  • BlinCT
  • Jan. 23, 2021, 9:25 a.m.

Правильное расположение элементов в ListView

Вся проблема в тмо что у меня репитор который должен правильно создавать по индексам эти ячейки. В случаи данной момедли 2 столбца а после засунуть туда правильный текст из модели. Вот тут какой…
s

qml и С++ setproperty

Доброе время суток. Вопрос может быть банальный... но не для меня ((( есть ли возможность при создании динамической переменной через функцию с++ "setProperty" этой переменной пол…

Ошибка при работе утилиты не удалось получить фабрику класса com для компонента с clsid

Проблема решилась. Оказывается для работы нужно чтобы был установлен Microsoft Office. Причем об этом нигде не было сказано.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB