A.
Allyans .Қаз. 17, 2018, 12:33 Т.Қ.

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

qt, WinAPI, titlebar

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


Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

9
Evgenii Legotckoi
  • Қаз. 18, 2018, 2:45 Т.Ж.

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

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

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


    A.
    • Қаз. 18, 2018, 4:16 Т.Ж.

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

      A.
      • Қаз. 19, 2018, 4:25 Т.Қ.
      • (өңделген)

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

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

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






        Evgenii Legotckoi
        • Қаз. 21, 2018, 12:02 Т.Қ.

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

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

          A.
          • Қаз. 21, 2018, 12:06 Т.Қ.

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

            Evgenii Legotckoi
            • Қаз. 21, 2018, 12:13 Т.Қ.

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

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


              A.
              • Қаз. 22, 2018, 12:22 Т.Қ.
              • (өңделген)

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

                Evgenii Legotckoi
                • Қаз. 23, 2018, 6:22 Т.Ж.

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

                  A.
                  • Қаз. 23, 2018, 6: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;

                    Пікірлер

                    Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                    Кіріңіз немесе Тіркеліңіз
                    OI
                    • Ora Iro
                    • Жел. 24, 2024, 6:38 Т.Ж.

                    C++ - Тест 001. Первая программа и типы данных

                    • Нәтиже:40ұпай,
                    • Бағалау ұпайлары-8
                    AD

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

                    • Нәтиже:50ұпай,
                    • Бағалау ұпайлары-4
                    m
                    • molni99
                    • Қаз. 26, 2024, 1:37 Т.Ж.

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

                    • Нәтиже:80ұпай,
                    • Бағалау ұпайлары4
                    Соңғы пікірлер
                    ИМ
                    Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                    Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                    Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                    Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                    Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas5Шілде 5, 2024, 11:02 Т.Ж.
                    QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Енді форумда талқылаңыз
                    Evgenii Legotckoi
                    Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                    t
                    tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                    NSProject
                    NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                    9
                    9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                    Бізді әлеуметтік желілерде бақылаңыз