a
andi87Қаз. 26, 2017, 9:23 Т.Қ.

QT gui: как поменять два элемента интерфейса местами?

Привет. Есть одна консольная игра nethack, для нее есть несколько графических интерфейсов. Мне приглянулся qt, но в нем есть один недостаток. Взгляните на первый скриншот в прикрепленной папке, окно игры состоит из трех основных элементов: карта (внизу), сообщения (слева сверху), статус (справа сверху). Я часто читаю окно сообщений, но расположено оно неудобно - слева, а было бы лучше, если располагалось бы в центре. Было бы неплохо поменять местами окна статуса и сообщений. Как я хочу сделать, изображено на втором скрине. К сожалению, я не нашел внутриигровых настроек, которые позволили бы это сделать. Все, что можно делать с этим окнами - это увеличивать или уменьшать их, перетягивая влево или вправо. Остается только редактирование исходного кода. Исходный код игры открыт, компилировать я умею. Знания qt - почти нулевые, навыки программирования - начальные. Смог найти код, который описывает, как сделаны окна сообщений и статуса. А что редактировать - понятия не имею. Прочитал немного документацию qt, узнал, что располагать элементы gui можно несколькими способами, можно вручную задавать координаты, или воспользоваться компоновщиком. Я не стал дальше читать, а решил спросить здесь. Как же все таки решить эту задачу? Кто хочет взглянуть на исходный код игры, он располагается здесь https://github.com/chasonr/nethack-3.6.0-patches/tree/interfaces . В папке win располагаются папки qt и qt4.

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

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

5
Evgenii Legotckoi
  • Қаз. 27, 2017, 5:16 Т.Ж.

День добрый.

Там есть класс главного окна приложения. NetHackQtMainWindow. Он располагается в файле qt_win.cpp .
В нём есть различные QGridLayout - это размещения, в которых находятся виджеты. Полагаю, что в одном из этих размещений и располагаются эти виджеты интерфейса.
В проекте нет ни одного файла компоновщика, там всё вручную сделано. Поэтому остаётся только найти в исходниках нужный Layout и поменять порядок установки в него виджетов.
    a
    • Қаз. 27, 2017, 12:37 Т.Қ.
    • (өңделген)

    Как я понял, каждый элемент - это один виджет. Т.е. окно сообщений - это один виджет, окно статуса - другой. Вы говорите, что все сделано вручную. Но тогда зачем в коде применяется qgridlayout? Я прочитал, если применять абсолютный или ручной метод позиционирования, qgridlayout вообще не используется. Или я что-то неправильно понял?

    >Поэтому остаётся только найти в исходниках нужный Layout
    Как я должен искать? Могут ли эти qgridlayout в qt_win.cpp указать, где именно искать?

    >Поэтому остаётся только найти в исходниках нужный Layout и поменять порядок установки в него виджетов.
    Вы можете уточнить, как должен выглядеть Layout? Я пробовал поискать в исходниках по слову Layout, нашел вызов функции layout(), это оно? А как меняется порядок установки виджетов? Это нужно координаты задавать? Или как-то по другому? Где-то нашел, что используется сортировка по имени виджетов. Можно ссылку на какой нибудь пример кода, который в котором описывается порядок установки виджетов? Чтобы я хоть примерно представлял, что искать. Есть два файла, qt4msg.cpp и qt4stat.cpp, которые описывают окна статуса и сообщений. В первом файле нет ни одного слова layout, во втором есть, но относится по видимому не к расположению самого окна статуса, а элементов внутри него.

    Еще вопрос, какую программу использовать для отладки? Чтобы можно было что-то поменять в коде, и сразу посмотреть на результат. Компилирую проект через mingw32-make, но каждый раз компилировать утомительно.

      Evgenii Legotckoi
      • Қаз. 28, 2017, 6:38 Т.Ж.
      • Жауап шешім ретінде белгіленді.
      qgridlayout вообще не используется. Или я что-то неправильно понял?
      Скорее я не совсем чётко выразился. Под ручной вёрсткой в Qt Creator я подразумеваю всегда написание вёрстки через код в исходниках, без использования дизайнера интерфейсов. То есть в проекте тогда будут содержаться *.ui файлы, но их в данном проекте нет. Значит вся вёрстка писалась вручную в коде. То есть это моё утверждение не касается того, с использованием абсолютного позиционирования было сделано или через компоновщики QGridLayout.

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

      Возможно, стоит поправить этот код
      void NetHackQtMainWindow::ShowIfReady()
      {
          if (message && map && status) {
      	QPoint pos(0,0);
      	QWidget* p = qt_compact_mode ? stack : centralWidget();
      	message->Widget()->recreate(p,0,pos);
      	map->Widget()->recreate(p,0,pos);
      	status->Widget()->recreate(p,0,pos);
      	if ( qt_compact_mode ) {
      	    message->setMap(map);
      	    stack->addWidget(map->Widget(), 0);
      	    stack->addWidget(message->Widget(), 1);
      	    stack->addWidget(status->Widget(), 2);
      	    raiseMap();
      	} else {
      	    layout();
      	}
      	showMaximized();
          } else if (isVisible()) {
      	hide();
          }
      }
      попробуйте переписать так
      void NetHackQtMainWindow::ShowIfReady()
      {
          if (message && map && status) {
      	QPoint pos(0,0);
      	QWidget* p = qt_compact_mode ? stack : centralWidget();
      	message->Widget()->recreate(p,0,pos);
              map->Widget()->recreate(p,0,pos);
              status->Widget()->recreate(p,0,pos);
      	if ( qt_compact_mode ) {
      	    message->setMap(map);
      	    stack->addWidget(map->Widget(), 0);
                  stack->addWidget(status->Widget(), 1);
      	    stack->addWidget(message->Widget(), 2);
      	    raiseMap();
      	} else {
      	    layout();
      	}
      	showMaximized();
          } else if (isVisible()) {
      	hide();
          }
      }
      Для отладки и вообще для работы с проектом используйте Qt Creator. Это IDE.
        a
        • Қаз. 28, 2017, 8:50 Т.Ж.

        Благодарю за информацию и предложенное решение. Поменял код, ничего не изменилось. Но я обратил внимание, что измененный код входит в блок if (qt_compact_mode), а compact mode - это опция игры, которая насколько я понял, разделяет окна сообщений, статуса и карты на три отдельных окна windows. Вроде то, что мне нужно, но когда меняю эту опцию, при запуске игра вылетает с ошибкой. Полагаю, что искать решение ошибки не вариант.  Наткнулся на такой вот код, в qt4main.cpp:

        void NetHackQtMainWindow::AddMessageWindow(NetHackQtMessageWindow* window)
        {
            message=window;
            hsplitter->insertWidget(0, message->Widget());
            ShowIfReady();
        }
        
        void NetHackQtMainWindow::AddMapWindow(NetHackQtMapWindow2* window)
        {
            map=window;
            vsplitter->insertWidget(1, map->Widget());
            ShowIfReady();
            connect(map,SIGNAL(resized()),this,SLOT(layout()));
        }
        
        void NetHackQtMainWindow::AddStatusWindow(NetHackQtStatusWindow* window)
        {
            status=window;
            hsplitter->insertWidget(2, status->Widget());
            ShowIfReady();
        Почему то кажется, что это именно то, что мне нужно. Не знаю правда, что здесь нужно поменять, буду разбираться методом тыка. Про использование Qt Creator - понятно, но непонятно, что нужно сделать, чтобы начать отладку. Я так понимаю, нужно нажать открыть проект, но в папке с исходниками нет ни одного файла с расширением проекта qt. Есть файл проекта visual studio, но при попытке отладить вылазят ошибки.
          a
          • Қаз. 28, 2017, 9:14 Т.Ж.

          Ура, я сделал это. Получилось с первого раза, причем результат оказался близок к идеалу. Просто решил для начала поменять цифры местами, было:

              hsplitter->insertWidget(0, message->Widget());
              hsplitter->insertWidget(2, status->Widget());
          Стало:
              hsplitter->insertWidget(2, message->Widget());
              hsplitter->insertWidget(0, status->Widget());
          Окна поменялись местами, причем осталась возможность менять их размер и положение по горизонтали. Задача решена, спасибо! Есть еще некритичные моменты по интерфейсу, которые хотелось бы поменять, теперь будет время про qt почитать подробнее)

            Пікірлер

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

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

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

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

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

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

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

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