Zorroh772 0 / 0 / 1 Регистрация: 23.02.2017 Сообщений: 11 |
||||||||||||||||||||||||
1 |
||||||||||||||||||||||||
15.09.2019, 12:38. Показов 6403. Ответов 6 Метки нет (Все метки)
Пытаюсь соединить сигнал со слотом. В основном выводе пишет QObject::connect: No such signal Form::sendData() in ..untitled2mainwindow.cpp:21. Через брейк поинт попал в файл новой формы moc_form.cpp и обнаружил следующие ошибки:
Файлы главной формы (на форме listWidget и кнопка)
Файлы второй формы (на форме lineEdit и кнопка)
Вложения
0 |
5490 / 4260 / 1211 Регистрация: 12.10.2013 Сообщений: 12,262 Записей в блоге: 2 |
|
15.09.2019, 13:27 |
2 |
обнаружил следующие ошибки: Самая главная ошибка в вашем коде — несовпадение сигнатур методов сигнала и слота. У вас метод сигнала без параметра, а метод слота с параметром. Так делать нельзя, можно наоборот — метод сигнала с параметром, а слота без параметров. Добавлено через 10 минут
0 |
Zorroh772 0 / 0 / 1 Регистрация: 23.02.2017 Сообщений: 11 |
||||
15.09.2019, 14:07 [ТС] |
3 |
|||
Таким образом?
0 |
insite2012 5490 / 4260 / 1211 Регистрация: 12.10.2013 Сообщений: 12,262 Записей в блоге: 2 |
||||
15.09.2019, 14:14 |
4 |
|||
Таким образом?
У вас что, в IDE подсказки не работают? Обычно после написания макроса SIGNAL/SLOT IDE сама выводит список имеющихся, вам достаточно выбрать нужный.
0 |
Zorroh772 0 / 0 / 1 Регистрация: 23.02.2017 Сообщений: 11 |
||||
15.09.2019, 16:41 [ТС] |
5 |
|||
Слот сразу выводит, а сигнал не выводит Добавлено через 2 часа 5 минут
0 |
_SayHello 874 / 535 / 175 Регистрация: 30.07.2015 Сообщений: 1,739 |
||||||||
15.09.2019, 19:09 |
6 |
|||||||
Zorroh772, Замени:
На
0 |
Анна по жизни 284 / 173 / 62 Регистрация: 13.03.2019 Сообщений: 419 |
||||||||
19.09.2019, 17:05 |
7 |
|||||||
Убираем оба str и будет вам счастье:
Вообще-то, об этом в документации написано.
0 |
|
|
|
Qt (проблемы с MOC)
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Member Рейтинг (т): 0 |
Привет. Есть такая программа, состоящая из трех чатей: #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 в классе в котором будут реализованы слоты. |
gryz |
|
Member Рейтинг (т): 14 |
ЧТо за ошибка? |
sploid |
|
надо изменить файл *.pro что бы утилита moc заново проверила все классы и сгенерировала код, где есть макрос Q_OBJECT |
Druid |
|
Member Рейтинг (т): 0 |
Цитата sploid @ 13.09.06, 13:31 надо изменить файл *.pro что бы утилита moc заново проверила все классы и сгенерировала код, где есть макрос Q_OBJECT
А как это можно сделать? |
gryz |
|
Member Рейтинг (т): 14 |
Если ты работаешь Qt 3 только в 2003 студии , то нет необходимости использовать pro-файл. Как это исправить? Если у тебя Qt установлена «как надо», то в студии должна быть панель Qt с несколькими кнопочками. Установить ее можно используя QMsNetSetup.msi в папке Qt. Сделай в студии текущим редактируемым документом Calculator.h и нажми на кнопку со словом ‘MOC’. Если не поможет, сообщи, что собственно пишется в ошибке |
Druid |
|
Member Рейтинг (т): 0 |
Все заработало, спасибо. Интересно, а почему он сам не подхватил, что у него там слоты есть, ведь MOC должен это сам все находить? |
gryz |
|
Member Рейтинг (т): 14 |
вообще он «подхватывает». надо только в первый раз при создании класса (после добавления макроса Q_OBJECT) нажать «MOC». (Если не глючит ничего.) |
Druid |
|
Member Рейтинг (т): 0 |
Цитата gryz @ 14.09.06, 11:26 вообще он «подхватывает». надо только в первый раз при создании класса (после добавления макроса Q_OBJECT) нажать «MOC». (Если не глючит ничего.) А в Linux Qt можно также куда-то встроить, как в Windows в Visual Studio? И там есть какая-либо альтернатива кнопки MOC, как в Visual Studio, просто у нас на работе Qt это первый шаг в сторону перехода на Linux, так что скоро возможно придется там писать ) А что значит последняя строка в следующем отрывке QString str = ((QPushButton*)sender())->text();//взять текст надписи с нажатой кнопки if (str.contains(QRegExp(«[0-9]»))) {}
? Сообщение отредактировано: Druid — 14.09.06, 11:53 |
gryz |
|
Member Рейтинг (т): 14 |
http://www.linuxcenter.ru/lib/books/qt3/qt3_5.phtml#HELLOQT |
Druid |
|
Member Рейтинг (т): 0 |
Цитата gryz @ 14.09.06, 12:26 Попробуй str.contains(QRegExp(QString(«[0-9]»)))
error C2440: ‘type cast’ : cannot convert from ‘QString’ to ‘QRegExp’. |
gryz |
|
Member Рейтинг (т): 14 |
а #include <qregexp.h> в cpp-шник добавил? |
Druid |
|
Member Рейтинг (т): 0 |
Цитата gryz @ 14.09.06, 12:42 а #include <qregexp.h> в cpp-шник добавил?
Упс… ) |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Общие вопросы
- Следующая тема
[ Script execution time: 0,0715 ] [ 16 queries used ] [ Generated: 9.06.23, 02:07 GMT ]
This topic has been deleted. Only users with topic management privileges can see it.
This a bit baffling to a new comer such as myself.
We have this fairly large application that relies on Qt for interfacing. The idea is to convert it to static for distribution (it seems some dll’s conflic with those of other tools for a shared distribution).
Compiling Qt (version 4.5.2 used) as static went OK, but now, when trying to build the complete tool itself (using MS Visual Studio 2005, on Windows XT) we have one of the file, internally captioned as having been generated by the User Interface Compiler (the header of the file in question PrintersDialog.cpp reads:
@/****************************************************************************
** Form implementation generated from reading ui file ‘printersdialog.ui’
**
** Created: Tue Mar 4 14:37:34 2008
** by: The User Interface Compiler ($Id: qt/main.cpp 3.3.0b1 edited Nov 24 13:47 $)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/@
as can be seen, this file is already 4 year old, and there is little hope I can locate the person who triggered its generation)
failing to generate, the seemingly required moc_PrintersDialog.cpp is missing.
If one starts by building a shared version of the program, a rather tedious process since then a shared version of Qt needs to be brought on line, the moc file is created along with the other 12 that pop up; and if that moc file is then added to the source code for the static build — which does generate those other 12 moc files — then comppilation proceeds properly and we do get our executable.
So, the question is:
- what is preventing the moc_PrintersDialog.cpp file form being created, and what can we do to make sure it is generated when needed in a static build?
Best regards
CBVG
That file is generated by moc, the meta object compiler, a tool bundled with Qt.
You can call it on the command line manually:
@
moc -o moc_file.cpp file.h
@
Or put that somewhere into your VS project.
I will sure give this a try, as soon as I figure where to add the instruction, so thanks.
Still, that is a work around, and I wonder why «moc» does it for the other files and not that one when in static. Does this mean there must be some of those «moc» commands that are part of the VS project, one of which is controlled and inhibited by a variable that is related to the build being static?
Regards
CBVG
Does the PrintersDialog.h header file have a Q_OBJECT macro in it?
That is the whole file here:
@#ifndef PRINTERSDIALOG_H
#define PRINTERSDIALOG_H
#include <QObject>
#include <qdialog.h>
class Q3VBoxLayout;
class Q3HBoxLayout;
class QGridLayout;
class QSpacerItem;
class QPushButton;
class Q3ListBox;
class Q3ListBoxItem;
class QPrinter;
class QLineEdit;
class CPrintersDialog : public QDialog
{
Q_OBJECT
public:
CPrintersDialog( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0 );
~CPrintersDialog();
void print();
public slots:
bool getSelectedPrinterName(QString& name) {name = selectedPrinter; return printerSelected;}
protected:
Q3HBoxLayout* layout5;
QSpacerItem* spacer5;
QPushButton* okButton;
QPushButton* cancelButton;
Q3ListBox* lstPrinters;
QString selectedPrinter;
bool printerSelected;
protected slots:
virtual void languageChange();
virtual void printerClicked(Q3ListBoxItem* item);
};
#endif // PRINTERSDIALOG_H@
CBVG
If you want visual studio to handle it, right click on the header file in solution explorer and select properties. In the properties dialog select under Item Type, custom build tool. Then fill in the fields as required. In the command line part, you want something like what volker suggested.
@»$(QTDIR)binmoc.exe» «%(FullPath)» -o «.GeneratedFiles$(ConfigurationName)moc_%(Filename).cpp «-I$(QTDIR)includeQtGui»» @
Or something like that but specific to your project.
Ah ha!
Thanks to you people clues and pointers, I was able to track down something that was different in the way the build step was defined for the PrintersDialog.h file. Instead of having
$(InputDir)moc_$(InputName).cpp
for output as all the other header files associated with ‘moc’, it was missing the «$(InputDir) part when compiling a shared solution.
Moreover, when attempting to compile a static one, it was entirely missing its custom build step. Filling those fields allowed for the generation of the required moc file. To coin a really bad pun, making it part of the solution made it no longer part of the problem.
I only hope one day to be as knoweldgable as you folks so that I could eventually pay it forward. In the mean time, the fine people on this forum have my gratitude.
Problem solved.
Glad you got your problem taken care of! Please be sure and edit the first post and change the thread title to add [Solved]. Thanks!
Я кодирую проект. Я начал получать ошибки после того, как попытался сделать статическую сборку. Я внес некоторые изменения, о которых я не помню. Но, я уверен, что если этот заглушка может быть очищен, тогда основной проект также может быть очищен.
Это файл заголовка.
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QFileDialog>
#include <QLabel>
#include <QMouseEvent>
#include <QObject>
#include <QPaintEvent>
class MyLabel:public QWidget
{
private:
QPixmap default_Pixmap;
QPixmap pixmap;
QFileDialog * fileDialog;
Q_OBJECT
public:
MyLabel();
void setPixmap(QPixmap pixmap);
void setDefault();
protected:
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent * event);
signals:
void file_Selected(QString fileName);
private slots:
void file_Got_Selected(QString fileName);
};
#endif // MYLABEL_H
Вот исходный файл
#include "MyLabel.h"
#include "MyMessageBox.h"
#include <QFileDialog>
#include <QPainter>
MyLabel::MyLabel():QWidget()
{
default_Pixmap = QPixmap("select.gif").scaled(250,100);
this->fileDialog=new QFileDialog(this);
fileDialog->setNameFilter("Image Files (*.BMP *.GIF *.JPG *.JPEG *.PNG *.PBM *.PGM *.PPM *.XBM *.XPM)");
connect(fileDialog,SIGNAL(fileSelected(QString)),this,SIGNAL(file_Selected(QString)));
connect(fileDialog,SIGNAL(fileSelected(QString)),this,SLOT(file_Got_Selected(QString)));
}
void MyLabel::setPixmap(QPixmap pixmap)
{
this->pixmap = pixmap;
}
void MyLabel::setDefault()
{
this->pixmap = default_Pixmap;
}
void MyLabel::mousePressEvent(QMouseEvent *event)
{
fileDialog->show();
//QString file_Name = file_Dialog.getOpenFileName();
}
void MyLabel::paintEvent(QPaintEvent * event)
{
QPainter painter(this);
painter.drawPixmap(0,0,width(),height(),pixmap.scaled(QSize(width(),height())));
}
void MyLabel::file_Got_Selected(QString fileName)
{
this->pixmap = QPixmap(fileName);
}
#include "myLabel.moc"
И это основной файл
#include <QLabel>
#include <QPixmap>
#include <QtGui/QApplication>
#include "myLabel.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyLabel mm;
//mm.setPixmap(QPixmap("dummy.jpg"));
//mm.setPixmap(QPixmap());
mm.setDefault();
mm.show();
return a.exec();
}
Я создал файл moc с помощью командной строки qt и команды
moc myLabel.h -o myLabel.moc
После этого я попытался скомпилировать проект через Qt-Editor. Но я получил множественную ошибку определения следующим образом:
debug/moc_myLabel.o:d:/TempInstallationFolder/Qt/Dynamic/qt/include/QtCore/../../src/corelib/global/qglobal.h:1381: multiple definition of `MyLabel::metaObject() const'
debug/myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/../CalendarNew//myLabel.moc: 57: сначала определено здесь
debug/moc_myLabel.o: C:Documents and Settings
debug/myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/../CalendarNew//myLabel.moc: 62: сначала определено здесь
debug/moc_myLabel.o: C:Documents and Settings<имя_файланедействительный **)
debug/myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/../CalendarNew//myLabel.moc: 70: сначала определено здесь
debug/moc_myLabel.o: C:Documents and Settings
debug/myLabel.o: C:Documents and SettingsprabhakaranDesktopCalendarNew-build-desktop/../CalendarNew//myLabel.moc: 87: сначала определено здесь
debug/moc_myLabel.o: moc_myLabel.cpp:(. данные + 0x0): множественное определение `MyLabel:: staticMetaObject ‘
debug/myLabel.o: myLabel.cpp:(. данные + 0x0): сначала определено здесь
collect2: ld возвращен 1 статус выхода
mingw32-make [1]: * [debugCalendarNew.exe] Ошибка 1
mingw32-make: * [debug] Ошибка 2
Процесс «D:/TempInstallationFolder/Qt/Dynamic/mingw/bin/mingw32-make.exe» вышел с кодом% 2.
Ошибка при создании проекта CalendarNew (цель: рабочий стол)
При выполнении шага сборки «Сделать»
Кто-нибудь, пожалуйста, избавь меня от этой проблемы.
При теневой сборке debug shared Qt 4.8.1 из исходников src получаем ошибки с отсутствием MOC файлов.
Примечание: возможно, что при статической теневой сборки ошибок не получаем.
Для debug shared сборки на самом деле ошибки ушли, когда заменили ключ компиляции -MTd на -MDd,
MT MTd MD MDd ключи компиляции.
moc файлы (точнее их наименование) бывает двух видов. И может генерироваться также до двух таких файлов одновременно.
moc_foo.cpp из foo.h, если и только если foo.h содержит Q_OBJECT макрос.
foo.moc из foo.cpp, если и только если foo.cpp содержит #include «foo.moc».
Небольшое замечание — например при сборке статически можем получить два сообщения об ошибках, но сборка нормально продолжается и завершается.
И как ни странно вроде все далее при использовании этих библиотек работает нормально.
tmpmocrelease_sharedmoc_qnetworkaccessmanager.cpp:93: error: C2491: ‘QNetworkAccessManager::staticMetaObjectExtraData’ : definition of dllimport static data member not allowed
tmpmocrelease_sharedmoc_qnetworkaccessmanager.cpp:97: error: C2491: ‘QNetworkAccessManager::staticMetaObject’ : definition of dllimport static data member not allowed
Не найден qftp.moc
Пример решения проблемы связанной с файлом qftp.moc (точнее с его отсутствием). Запускаем qmake.exe на исходниках Qt вариант release static в теневой каталог и не можем понять, почему не создается qftp.moc файл.
moc файлы создает qmake.exe . Возможно помогло удаление всех tmp каталогов и Makefile.* и каталога src исходников. Возможно помолго отключение -dont-process в конфигурировании. Но факт есть факт ошибка ушла.