
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Привет. Есть такая программа, состоящая из трех чатей:
1-я (main) ![]() ![]() #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) ![]() ![]() #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) ![]() ![]() #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 в классе в котором будут реализованы слоты. В чем может быть дело? |
Сообщ.
#2
,
|
|
|
ЧТо за ошибка?
|
Сообщ.
#3
,
|
|
|
надо изменить файл *.pro что бы утилита moc заново проверила все классы и сгенерировала код, где есть макрос Q_OBJECT
|
Сообщ.
#4
,
|
|
|
Цитата sploid @ надо изменить файл *.pro что бы утилита moc заново проверила все классы и сгенерировала код, где есть макрос Q_OBJECT А как это можно сделать? версия qt 3.3.6 |
Сообщ.
#5
,
|
|
|
Если ты работаешь Qt 3 только в 2003 студии , то нет необходимости использовать pro-файл.
Ошибка линковки скорее всего возникает из-за того, что для твоего класса не был создан moc-файл вида moc_Calculator.cpp или он не был добавлен в проект и следовательно не компилируется. Как это исправить? Если у тебя Qt установлена "как надо", то в студии должна быть панель Qt с несколькими кнопочками. Установить ее можно используя QMsNetSetup.msi в папке Qt. Сделай в студии текущим редактируемым документом Calculator.h и нажми на кнопку со словом 'MOC'. Если не поможет, сообщи, что собственно пишется в ошибке |
Сообщ.
#6
,
|
|
|
Все заработало, спасибо. Интересно, а почему он сам не подхватил, что у него там слоты есть, ведь MOC должен это сам все находить?
И еще вопрос немного не по теме, что за класс QRegExp ? |
Сообщ.
#7
,
|
|
|
вообще он "подхватывает". надо только в первый раз при создании класса (после добавления макроса Q_OBJECT) нажать "MOC". (Если не глючит ничего.)
QRegExp - класс для работы с регулярными выражениями. Позволяет описать множество строк. Например, множество строк, заканчивающееся на ".txt". У него много возможностей. см. assistant ) |
Сообщ.
#8
,
|
|
|
Цитата gryz @ вообще он "подхватывает". надо только в первый раз при создании класса (после добавления макроса Q_OBJECT) нажать "MOC". (Если не глючит ничего.) QRegExp - класс для работы с регулярными выражениями. Позволяет описать множество строк. Например, множество строк, заканчивающееся на ".txt". У него много возможностей. см. assistant ) А в Linux Qt можно также куда-то встроить, как в Windows в Visual Studio? И там есть какая-либо альтернатива кнопки MOC, как в Visual Studio, просто у нас на работе Qt это первый шаг в сторону перехода на Linux, так что скоро возможно придется там писать ) А что значит последняя строка в следующем отрывке ![]() ![]() QString str = ((QPushButton*)sender())->text();//взять текст надписи с нажатой кнопки if (str.contains(QRegExp("[0-9]"))) {} ? И почему на нее выскакивает ошибка "error C2440: 'type cast' : cannot convert from 'const char [6]' to 'QRegExp'" ? Я тут пытаюсь реализовать пример с книжки и он не заводится никак, уже половину всего переправил, ту половину в которой разобрался ) |
Сообщ.
#9
,
|
|
|
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]"))) |
Сообщ.
#10
,
|
|
|
Цитата gryz @ Попробуй str.contains(QRegExp(QString("[0-9]"))) error C2440: 'type cast' : cannot convert from 'QString' to 'QRegExp'. Как я понимаю, у него такого конструктора предобразования типа нет? |
Сообщ.
#11
,
|
|
|
а #include <qregexp.h> в cpp-шник добавил?
|
Сообщ.
#12
,
|
|
|
Цитата gryz @ а #include <qregexp.h> в cpp-шник добавил? Упс... ) в книжке не написали, а я не подумал. Добавил и все заработало. Огромное спасибо |