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.

Do you like it? Share on social networks!

9
Evgenii Legotckoi
  • Oct. 18, 2018, 2:45 a.m.

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

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

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


    A.
    • Oct. 18, 2018, 4:16 a.m.

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

      A.
      • Oct. 19, 2018, 4:25 p.m.
      • (edited)

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

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

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






        Evgenii Legotckoi
        • Oct. 21, 2018, 12:02 p.m.

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

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

          A.
          • Oct. 21, 2018, 12:06 p.m.

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

            Evgenii Legotckoi
            • Oct. 21, 2018, 12:13 p.m.

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

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


              A.
              • Oct. 22, 2018, 12:22 p.m.
              • (edited)

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

                Evgenii Legotckoi
                • Oct. 23, 2018, 6:22 a.m.

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

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

                    Follow us in social networks