На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: Majestio
  
> Как подключить библиотеку ncurses к проекту на Qt Creator ?
    Я создал проект на Qt Creator 4.12.2 под именем NcursesTest в операционной системе Windows 10, в котором используется библиотека ncurses для работы с консольным окном.
    Библиотеку ncurses я установил на мой компьютер с помощью программы MSYS2. После установки MSYS2 я вызвал MSYS MING32, в окне я ввёл команду
    Цитата
    $ pacman –Suy

    для обновления репозитория, затем я закрыл это окно с помощью команды exit, затем я снова вызвал MSYS MING32, в окне которого я ввёл
    Цитата
    $ pacman –Ss ncurses

    Для установки библиотеки ncurses.
    После этого я то же самое сделал с MSYS MING64 – сперва ввёл в его окне
    Цитата
    $ pacman –Suy

    А затем, после закрытия этого окна с помощью команды exit, я заново вызвал MSYS MINGW64 и ввёл в его окне команду
    Цитата
    $ pacman –Ss ncurses

    В результате чего библиотека ncurses была установлена на мой компьютер.

    Файл mainwindow.cpp моего проекта:

    ExpandedWrap disabled
      #include “mainwindow.h”
      #include “ui_mainwindow.h”
      #include “ncurses.h”
       
      MainWindow::MainWindow(QWidget *parent)
                                  : QMainWindow(parent),
                                 Ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
      }
       
      MainWindow::~MainWindow()
      {
          delete  ui;
      }
       
      void  MainWindow::on_pushButton_clicked()
      // если была нажата кнопка “Выход”
      {
          close();
      }
       
      void  MainWindow::on_pushButton_2_clicked()
      // если была нажата кнопка “Тестировать”
      {
          initscr();
          printw(“Hello world!\n”);
          refresh();
          getch();
          endwin();
      }


    В результате при компиляции проекта появляются сообщения об ошибках:

    Цитата
    undefined reference to ‘initstr’
    undefined reference to ‘printw’
    undefined reference to ‘refresh’
    undefined reference to ‘stdscr’
    undefined reference to ‘wgetch’
    undefined reference to ‘endwin’


    Файл NcursesTest.pro выглядит следующим образом:

    Цитата
    QT += core gui
    greaterThan(QT_MAJOR_VERSION,4): QT+=widgets
    CONFIG += c++11
    DEFINES += QT_DEPRECATED_WARNINGS

    SOURCES += \
    main.cpp
    mainwindow.cpp

    HEADERS += \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/curses.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesapp.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesf.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesm.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesp.h \ 
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesw.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursslk.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/eti.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/etip.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/form.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/menu.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/nc_tparm.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_dll.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_mingw.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/panel.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term_entry.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/termcap.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/tic.h \
    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/unctrl.h \
    mainwindow.h

    FORMS += \
    mainwindow.ui

    INCLUDEPATH += /path/to/ncurses/headers
    INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw

    LIBS ++ -L/path/to/ncurses/library/-lncursesw

    qnx: target.path = /tmpl/$${TARGET}/bin
    else: unix:!android:target.path=/opt/$${TARGET}/bin
    !isEmpty(target.path):INSTALLS+=target
    Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw
    else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw
    else:unix: LIBS += -LC:/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw

    DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw


    Как сделать так, чтобы у меня произошло правильное подключение библиотеки ncurses в мой проект? Как сделать так, чтобы моя программа нормально скомпилировалась и запустилась?
      может
      LIBS += -L/path/to/ncurses/library/-lncursesw

      и совет- не используйте формы
        и вот это
        INCLUDEPATH += /path/to/ncurses/headers
          Чета я теряю нить разрабатываемого! :blink: Для консоли - нужно использовать проект для консольного приложения, при чет тут GUI?
            В общем показываю работающие варианты ...

            1) Работает, но я бы так не делал NcursesTest.pro

            ExpandedWrap disabled
              QT -= gui
              CONFIG += c++17 console
              CONFIG -= app_bundle
              SOURCES += \
                      main.cpp
              LIBS += -L$$PWD/../../../../mingw32/lib/ -lncursesw
              INCLUDEPATH += $$PWD/../../../../mingw32/include
              DEPENDPATH += $$PWD/../../../../mingw32/include

            2) Это ИМХО правильный вариант (с использованием pkg-config) NcursesTest.pro

            ExpandedWrap disabled
              QT -= gui
              CONFIG += c++17 console
              CONFIG -= app_bundle
              CONFIG += link_pkgconfig
              PKGCONFIG += ncursesw
              SOURCES += \
                      main.cpp

            Это сам main.cpp:

            ExpandedWrap disabled
              #include <QCoreApplication>
              #include <QtCore>
              #include <ncurses/ncurses.h>
               
              int main(int argc, char *argv[]) {
                  QCoreApplication app(argc, argv);
                  initscr();
                  printw("Hello world!\n");
                  refresh();
                  getch();
                  endwin();
                  QTimer::singleShot(0, &app, &QCoreApplication::quit);
                  return app.exec();
              }

            Код очень упрощен! Чтобы задействовать сигналы и слоты Qt - нужно логику выносить из main.

            И еще - не забыть в проекте QtCreator поставить галочку "Запускать в терминале":

            user posted image
              Цитата Majestio @
              Чета я теряю нить разрабатываемого! :blink: Для консоли - нужно использовать проект для консольного приложения, при чет тут GUI?

              Просто я создал тестовое диалоговое оконное приложение NcursesTest для того, чтобы проверить, как у меня из него запускается консольное окно после нажатия на одну из кнопок окна приложения.
                Нельзя так делать - либо консольное приложение, либо GUI. Это по фэн-шую, а остальное - от демонов! >:-[
                  В Linux все приложения консольные, а графический интерфейс это только дополнение. При этом консоль у приложения может быть скрыта.
                  В Windows вы можете просто открыть консоль с помощью WinAPI (AllocConsole / GetStdHandle / FreeConsole).

                  Настройки же компилятора в Linux заставляют отладчик отобразить консоль для отладки приложения.
                  В Windows эта настройка добавляют флаг в PE файл для загрузчика о необходимости создания консоли до запуска приложения.

                  Сама библиотека ncurses реализует только взаимодействие со стандартной системной консолью.
                  Т.е. вся работа, которую делает ncurses, это только ввод/вывод данных из/в консоли (ещё управление цветом текста в консоли и перемещение курсора).
                  Сообщение отредактировано: macomics -
                    Я изменил файл NcursesTest.pro:

                    Цитата
                    QT += core gui
                    greaterThan(QT_MAJOR_VERSION,4): QT+=widgets
                    CONFIG += c++11
                    CONFIG += link_pkgconfig
                    CONFIG += ncursesw

                    DEFINES += QT_DEPRECATED_WARNINGS

                    SOURCES += \
                    main.cpp
                    mainwindow.cpp

                    HEADERS += \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/curses.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesapp.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesf.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesm.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesp.h \ 
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesw.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursslk.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/eti.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/etip.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/form.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/menu.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/nc_tparm.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_dll.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_mingw.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/panel.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term_entry.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/termcap.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/tic.h \
                    C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/unctrl.h \
                    mainwindow.h

                    FORMS += \
                    mainwindow.ui

                    INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include
                    INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw
                    INCLUDEPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include
                    INCLUDEPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw

                    LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncurses.a
                    LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncursesw.a
                    LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncurses++w.a
                    LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncurses++w_g.a
                    LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncursesw_g.a

                    qnx: target.path = /tmpl/$${TARGET}/bin
                    else: unix:!android:target.path=/opt/$${TARGET}/bin
                    !isEmpty(target.path):INSTALLS+=target

                    Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses.a
                    else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses.a
                    else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses.a

                    Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw.a
                    else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw.a
                    else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw.a

                    Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w.a
                    else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w.a
                    else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w.a

                    Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w_g.a
                    else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w_g.a
                    else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w_g.a

                    Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw_g.a
                    else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw_g.a
                    else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw_g.a

                    DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include
                    DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw
                    DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib
                    DEPENDPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include
                    DEPENDPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw
                    DEPENDPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib



                    В файле mainwindow.cpp я написал:

                    ExpandedWrap disabled
                      #include "C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw/ncurses.h"


                    В результате чего заголовочный файл ncurses.h стал видеться из моего проекта (так как если написать #include "ncurses.h" или #include "ncursesw/ncurses.h" , то файл ncurses.h почему-то не видится из моего проекта).

                    Но при компиляции программы выдаются ошибки:

                    Цитата
                    undefined reference to 'initscr'
                    undefined reference to 'printw'
                    undefined reference to 'refresh'
                    undefined reference to 'stdscr'
                    undefined reference to 'wgetch'
                    undefined reference to 'endwin'


                    Такое ощущение, что компилятор не видит библиотечные файлы libncurses.a, libncursesw.a, libncurses+w.a, libncurses+w_g.a, libncursesw_g.a .

                    Как исправить эту ошибку, как сделать так, чтобы компилятор увидел библиотечные файлы библиотеки ncurses?
                      Когда используется pkg-config, он сам настраивает все заголовки и либы.
                      И всю эту дополнительную "муть" из файла проекта нужно удалить.
                      Я же приводил пример работающего файла проекта.
                      Он достаточен сам по себе - не нужно ничего дополнять более!

                      ExpandedWrap disabled
                        QT -= gui
                        CONFIG += c++17 console
                        CONFIG -= app_bundle
                        CONFIG += link_pkgconfig
                        PKGCONFIG += ncursesw
                        SOURCES += \
                                main.cpp

                      Это все - больше ничего не нужно!

                      PS. Ну если только сделать GUI приложение. Но повторюсь - делать GUI, при этом в консоли использовать ncurses, я считаю извратом.
                        Цитата
                        PS. Ну если только сделать GUI приложение. Но повторюсь - делать GUI, при этом в консоли использовать ncurses, я считаю извратом.


                        Ну вот у меня GUI-шное приложение (не программа NcursesTest, а та настоящая программа, которую я делаю). Как мне организовать в этом GUI-шном приложении консольный ввод-вывод?
                        Сообщение отредактировано: erslgoeirjh -
                          Наверное в конструкторе главного окна приложения инициализировать ncurses, а в деструкторе его остановить. Свят-свят-свят :rtfm:
                            сразу в майне
                              Я убрал linkpkg_config и PKGCONFIG.

                              Я сделал изменения в файле NcursesTest.pro и mainwindow.cpp . В результате у меня получилось:

                              1) файл NcursesTest.pro:

                              Цитата
                              QT += core gui

                              greater than(QT_MAJOR_VERSION, 4): QT += widgets

                              CONFIG += c++11

                              DEFINES += QT_DEPRECATED_WARNINGS

                              SOURCES += \
                              main.cpp
                              mainwindow.cpp

                              HEADERS += \
                              mainwindow.h

                              INCLUDEPATH += LC:\Qt\Qt5.12.9\Tools\mingw730_64\opt\bin

                              FORMS += \
                              mainwindow.ui

                              unix|win32: LIB += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib -lncurses

                              INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw

                              DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw


                              2) файл mainwindow.cpp:

                              ExpandedWrap disabled
                                #include "mainwindow.h"
                                #include "ui_mainwindow.h"
                                #include "ncurses.h"
                                 
                                MainWindow::MainWindow(QWidget *parent)
                                           :QMainWindow(parent),
                                           ui(new Ui::MainWindow)
                                {
                                    ui->setupui(this);
                                }
                                 
                                MainWindow::~MainWindow()
                                {
                                    delete ui;
                                }
                                 
                                void  MainWindow::on_pushButton_clicked()
                                // если была нажата кнопка "Выход"
                                {
                                    close();
                                }
                                 
                                void  MainWindow::on_pushButton_2_clicked()
                                // если была нажата кнопка "Тестировать"
                                {
                                    initscr();
                                    printw("Hello world!\n");
                                    refresh();
                                    getch();
                                    endwin();
                                }


                              В результате чего у меня программа компилируется, запускается. При нажатии на кнопку "Тестировать" у меня появляется консольное окно, на котором отображена надпись Hello world! и переход на следующую строку.
                              Но только почему-то при нажатии какой-либо клавиши у меня это консольное окно не закрывается. Как сделать так, чтобы это консольное окно закрывалось?
                              Сообщение отредактировано: erslgoeirjh -
                                И ещё вопрос. Я добавил код в функцию void MainWindow::on_pushButton_2_clicked() :

                                ExpandedWrap disabled
                                  void  MainWindow::on_pushButton_2_clicked()
                                  // если была нажата кнопка "Тестировать"
                                  {
                                      initscr();
                                      printw("Hello world!\n");
                                      refresh();
                                      printw("Enter first real number: ");
                                      refresh();
                                      scanw("%lf",&val1);
                                      printw("Enter first real number: ");
                                      refresh();
                                      scanw("%lf",&val2);
                                      val3 = val1 + val2;
                                      printw("Sum of two input values is: %f\n",val3);
                                      refresh();
                                      getch();
                                      endwin();
                                  }


                                В результате чего в консольном окне у меня выводится:

                                Цитата
                                Hello world!
                                Enter first real number:
                                Enter second real number:
                                Sum of two input numbers is: -2.000000


                                То есть ввод значений не осуществляется. Как сделать так, чтобы в консольном окне осуществлялся ввод значений?
                                  Чисто для поддержания беседы ... Но я до сих пор не понимаю прикладной её значимости ("Зачем из GUI пытаться управлять окном терминала/консольным приложением").
                                    Цитата Majestio @
                                    Чисто для поддержания беседы ... Но я до сих пор не понимаю прикладной её значимости ("Зачем из GUI пытаться управлять окном терминала/консольным приложением").


                                    Нужно для моей основной программы.

                                    Так как решить проблемы с функциями scanw и endwin?
                                    Сообщение отредактировано: erslgoeirjh -
                                      ещё совет не пользуйтесь scanf.
                                      И что то вы совсем не правильные вещи хотите
                                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0,0509 ]   [ 15 queries used ]   [ Generated: 14.12.25, 09:17 GMT ]