На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Qt (проблемы с MOC)
    Привет. Есть такая программа, состоящая из трех чатей:
    1-я (main)
    ExpandedWrap disabled
      #include <qapplication.h>
      #include "Calculator.h"
       
      int main( int argc, char ** argv )
      {
          QApplication app( argc, argv );
       
          Calculator calculator;
       
          app.setMainWidget(&calculator);
          calculator.setCaption("Calculator");
          calculator.resize(230,200);
       
          calculator.show();
          
          return app.exec();
      }


    2-я (Calculator.h)
    ExpandedWrap disabled
      #ifndef _Calculator_h_
      #define _Calculator_h_
       
      #include <qwidget.h>
      #include <qlayout.h>
      #include <qlcdnumber.h>
      #include <qpushbutton.h>
       
      class Calculator : public QWidget {
          Q_OBJECT
      private:
          QLCDNumber* m_plcd;
       
      public:
          Calculator(QWidget* pwgt = 0, const char* pszName = 0);
          QPushButton*    createButton(const QString& str);
      //public slots:
          //void slotButtonClicked();
      };
       
       
      #endif


    3-я (Calculator.cpp)
    ExpandedWrap disabled
      #include "Calculator.h"
       
      Calculator::Calculator(QWidget* pwgt, const char* pszName) : QWidget(pwgt, pszName)
      {
          QGridLayout*    ptopLayout = new QGridLayout(this, 5, 4, 5, 5);
       
          m_plcd = new QLCDNumber(12, this);
          m_plcd->setPaletteBackgroundColor(QColor(0x6F, 0x7F, 0));
          m_plcd->setSegmentStyle(QLCDNumber::Flat);
          m_plcd->setMinimumSize(150,50);
       
          ptopLayout->addMultiCellWidget(m_plcd, 0, 0, 0, 3);
       
          ptopLayout->addWidget(createButton("CE"), 1, 3);
       
          QChar   aButtons[4][4] = {  {'7', '8', '9','/'},
                                      {'4', '5', '6', '*'},
                                      {'1', '2', '3', '-'},
                                      {'0', '.', '=', '+'}
          };
       
          for (int i =0; i < 4; ++i) {
              for (int j = 0; j < 4; ++j) {
                  ptopLayout->addWidget(createButton(aButtons[i][j]), i + 2, j);
              }
          }
      }
       
      QPushButton*    Calculator::createButton(const QString& str)
      {
          QPushButton*    pcmd = new QPushButton(str, this);
          pcmd->setMinimumSize (40, 40);
          //connect(pcmd, SIGNAL(clicked()), SLOT(slotButtonClicked()));
          return pcmd;
      }
       
       
      void Calculator::slotButtonClicked()
      {
      }


    Возникает ошибка на этапе линковки в Visual Studio.NET 2003. Возникает она, когда пишешь макрос Q_OBJECT в классе в котором будут реализованы слоты.
    В чем может быть дело?
      ЧТо за ошибка?
        надо изменить файл *.pro что бы утилита moc заново проверила все классы и сгенерировала код, где есть макрос Q_OBJECT
          Цитата sploid @
          надо изменить файл *.pro что бы утилита moc заново проверила все классы и сгенерировала код, где есть макрос Q_OBJECT

          А как это можно сделать?
          версия qt 3.3.6
            Если ты работаешь Qt 3 только в 2003 студии , то нет необходимости использовать pro-файл.
            Ошибка линковки скорее всего возникает из-за того, что для твоего класса не был создан moc-файл вида moc_Calculator.cpp или он не был добавлен в проект и следовательно не компилируется.

            Как это исправить?

            Если у тебя Qt установлена "как надо", то в студии должна быть панель Qt с несколькими кнопочками. Установить ее можно используя QMsNetSetup.msi в папке Qt. Сделай в студии текущим редактируемым документом Calculator.h и нажми на кнопку со словом 'MOC'.

            Если не поможет, сообщи, что собственно пишется в ошибке
              Все заработало, спасибо. Интересно, а почему он сам не подхватил, что у него там слоты есть, ведь MOC должен это сам все находить?
              И еще вопрос немного не по теме, что за класс QRegExp ?
                вообще он "подхватывает". надо только в первый раз при создании класса (после добавления макроса Q_OBJECT) нажать "MOC". (Если не глючит ничего.)
                QRegExp - класс для работы с регулярными выражениями. Позволяет описать множество строк. Например, множество строк, заканчивающееся на ".txt".
                У него много возможностей. см. assistant )
                  Цитата gryz @
                  вообще он "подхватывает". надо только в первый раз при создании класса (после добавления макроса Q_OBJECT) нажать "MOC". (Если не глючит ничего.)
                  QRegExp - класс для работы с регулярными выражениями. Позволяет описать множество строк. Например, множество строк, заканчивающееся на ".txt".
                  У него много возможностей. см. assistant )

                  А в Linux Qt можно также куда-то встроить, как в Windows в Visual Studio? И там есть какая-либо альтернатива кнопки MOC, как в Visual Studio, просто у нас на работе Qt это первый шаг в сторону перехода на Linux, так что скоро возможно придется там писать )

                  А что значит последняя строка в следующем отрывке
                  ExpandedWrap disabled
                    QString str = ((QPushButton*)sender())->text();//взять текст надписи с нажатой кнопки
                    if (str.contains(QRegExp("[0-9]"))) {}

                  ?
                  И почему на нее выскакивает ошибка "error C2440: 'type cast' : cannot convert from 'const char [6]' to 'QRegExp'" ?
                  Я тут пытаюсь реализовать пример с книжки и он не заводится никак, уже половину всего переправил, ту половину в которой разобрался )
                  Сообщение отредактировано: Druid -
                    http://www.linuxcenter.ru/lib/books/qt3/qt3_5.phtml#HELLOQT
                    - написано как собирать проект. Сборку можно реализовать в виде batch файла, что довольно удобно. В линуксе с Qt работал мало, поэтому не занимался поиском "подходящей" среды разработки. Вроде в KDevelop что-то было из поддержки Qt.
                    Если только начинаете с Qt работать, то лучше начинать сразу с Qt 4
                    У меня приведенный тобой кусок кода компилится. Правда в 4.1.3.
                    Попробуй str.contains(QRegExp(QString("[0-9]")))
                      Цитата gryz @
                      Попробуй str.contains(QRegExp(QString("[0-9]")))

                      error C2440: 'type cast' : cannot convert from 'QString' to 'QRegExp'.
                      Как я понимаю, у него такого конструктора предобразования типа нет?
                        а #include <qregexp.h> в cpp-шник добавил?
                          Цитата gryz @
                          а #include <qregexp.h> в cpp-шник добавил?

                          Упс... )
                          в книжке не написали, а я не подумал.
                          Добавил и все заработало. Огромное спасибо
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0333 ]   [ 15 queries used ]   [ Generated: 15.06.25, 10:10 GMT ]