Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
1

Как вызвать c++ функцию?

01.02.2014, 21:53. Показов 7146. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем привет, уже перечиал кучу статей и примеров по qt, но нигде так и не увидел примера того как напрмер принажатии на кнопку, которая вызовит функцию на с++, которая в свою очередь выполнит определённые действия и например вернёт результат в форму, вот к примеру

Как вызвать c++ функцию?


хочу например чтобы ввести текст, нажать на кнопку и он отобразился в том большм блоке для текста, как это реализовать??? поробовал сделать, но нечё неработает

вот код

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
#include <QtGui/QFont>
#include <QtWidgets/QLabel>
 
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTextEdit>
 
 
#include <iostream>
#include <string>
 
 
 
using namespace std;
 
 
string my_string = "yy";
 
class MyClass : public QObject
{
      Q_OBJECT
 
public: MyClass(QObject *parent = 0);
public slots: 
    string mySlot(string text) { return my_string = text;  }
};
 
 
 
 
 
 
 
 int main(int argc, char *argv[])
 
 {
     
     
     
     QApplication app(argc, argv);
     
     QWidget *window = new QWidget();
     window->resize(620, 240);
 
     
       char *iq = "write the text";
       char *iq2 = (char *)my_string.c_str();
 
       QTextEdit textEdit(iq2);
 
 
     QLabel *label = new QLabel(iq);
     QLineEdit *lineEdit = new QLineEdit();
 
 
      QPushButton button("Press me", window);
 
       QObject::connect(&button, SIGNAL(clicked()),&app, SLOT(MyClass->mySlot(lineEdit))); 
 
       button.resize(100, 30);
 
 
     QHBoxLayout *layout = new QHBoxLayout();
 
     
 
     layout->addWidget(label);
     layout->addWidget(lineEdit);
     layout->addWidget(&button);
     layout->addWidget(&textEdit);
     window->setLayout(layout);
 
 
     window->show();
     return app.exec();
 
     
 
 
     
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2014, 21:53
Ответы с готовыми решениями:

Как правильно передать вектор в функцию и вызвать эту функцию?
Здравствуйте, объясните как исправить ошибку. Возникает после for(), выдается, что размер polygon =...

Как вызвать функцию в дочерней форме
Создаю в основной форме новую форму через NewForm *newForm = new NewForm(this); newForm-&gt;show();...

Как вызвать функцию в Qt с переменной, которая берется из другой формы?
Есть две формы (firstForm и MainWindow). В firstForm присутствует SpinBOX, из которого мне нужно...

Вызвать функцию java из Qt 5.2
Есть некий код Qt который вызываеться void GENERALS::Install_File() { QAndroidJniObject...

18
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
01.02.2014, 22:25 2
Слот ничего не должен возвращать, т.к. он лишь выполняется. То бишь если нужно на кнопку повесить слот, то делаем так:
C++ (Qt)
1
2
3
//в .h
public slots: 
    void mySlot();
Далее:
C++ (Qt)
1
2
3
void MyClass::mySlot(){
    label2->setText(lineedit->text()); //если нужно из line edit'а текст в label вывести
}
и вешаем на кнопку
C++ (Qt)
1
connect(button, SIGNAL(clicked()), this, SLOT(mySlot()));
Добавлено через 13 секунд
А вообще с такими вопросами советую Шлее почитать...
1
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
01.02.2014, 22:43  [ТС] 3
тут небольшие проблемы возникли


1)
C++ (Qt)
1
2
3
void MyClass::mySlot(){
    label2->setText(lineedit->text()); //если нужно из line edit'а текст в label вывести
}
это куда пихатть? в маин или класс? или куда?


2)
C++ (Qt)
1
connect(button, SIGNAL(clicked()), this, SLOT(mySlot()));
такой вариант не прокатывает, пишет ошибки

2 IntelliSense: отсутствуют экземпляры перегруженная функция "QObject::connect", соответствующие списку аргументов
типы аргументов: (QPushButton, const char *, <error-type>, const char *) c:\Users\Admin\Documents\Visual Studio 2012\Projects\my_qt\my_qt\main.cpp 65 5 my_qt
3 IntelliSense: оператор "this" можно использовать только внутри нестатической функции-члена c:\Users\Admin\Documents\Visual Studio 2012\Projects\my_qt\my_qt\main.cpp 65 49 my_qt
3) шлее это что? где почитать?
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
02.02.2014, 01:37 4
Уф.
1) Это реализация слота, то бишь если у тебя есть .h и .cpp класса - пихай в cpp
2) QPushButton должен быть указателем (QPushButton*)
3) Шлее - автор книг по Qt, ищи Шлее - "Qt 4.8. Профессиональное программирование на C++"

Добавлено через 1 час 19 минут
Кстати, забыл добавить. Если все-таки нужен именно объект кнопки, а не указатель (см. п. 2), то можно сделать так
C++ (Qt)
1
connect(&button, SIGNAL(clicked()), this, SLOT(mySlot()));
И я хотел-бы глянуть код, ибо ошибка не толькт в этом.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
02.02.2014, 13:24  [ТС] 5
Цитата Сообщение от MastAKK Посмотреть сообщение
Уф.
1) Это реализация слота, то бишь если у тебя есть .h и .cpp класса - пихай в cpp
2) QPushButton должен быть указателем (QPushButton*)
3) Шлее - автор книг по Qt, ищи Шлее - "Qt 4.8. Профессиональное программирование на C++"

Добавлено через 1 час 19 минут
Кстати, забыл добавить. Если все-таки нужен именно объект кнопки, а не указатель (см. п. 2), то можно сделать так
C++ (Qt)
1
connect(&button, SIGNAL(clicked()), this, SLOT(mySlot()));
И я хотел-бы глянуть код, ибо ошибка не толькт в этом.
такс, ну код от того что впервом посте не сильно отличается,

1) сделал QPushButton указателем, а conect серовно на this ругается

2)я вот непойму, у меня подчёркивает в этом коде

C++ (Qt)
1
2
3
void MyClass::mySlot(){
    label2->setText(lineedit->text()); 
}
label2 и lineedit пишет что идентефикатор не определён, непойму почему, ведь QLineEdit и QLabel я подключил

ну вот собственно что имеем

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
#include <QtGui/QFont>
#include <QtWidgets/QLabel>
 
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTextEdit>
 
 
#include <iostream>
#include <string>
 
 
 
using namespace std;
 
 
string my_string = "yy";
 
class MyClass : public QObject
{
      Q_OBJECT
 
public: MyClass(QObject *parent = 0);
public slots: 
    void mySlot();
 
 
};
 
    void MyClass::mySlot(){
    label2->setText(lineedit->text()); 
}
 
 
 
 
 
 int main(int argc, char *argv[])
 
 {
     
 
     
     QApplication app(argc, argv);
     
     QWidget *window = new QWidget();
     window->resize(620, 240);
 
     
       char *iq = "write the text";
       char *iq2 = (char *)my_string.c_str();
 
       QTextEdit textEdit(iq2);
 
 
     QLabel *label = new QLabel(iq);
     QLineEdit *lineEdit = new QLineEdit();
 
 
      QPushButton *button = new QPushButton("Press me", window);
 
       QObject::connect(button, SIGNAL(clicked()), this, SLOT(mySlot()));
 
     
 
 
     QHBoxLayout *layout = new QHBoxLayout();
 
     
 
     layout->addWidget(label);
     layout->addWidget(lineEdit);
     layout->addWidget(button);
     layout->addWidget(&textEdit);
     window->setLayout(layout);
 
 
     window->show();
     return app.exec();
 
     
 
 
     
 }
ошибки

C++ (Qt)
1
2
3
4
5
6
7
    1   IntelliSense: идентификатор "label2" не определен   c:\Users\Admin\Documents\Visual Studio 2012\Projects\my_qt\my_qt\main.cpp   34  5   my_qt
 
 
    2   IntelliSense: идентификатор "lineedit" не определен c:\Users\Admin\Documents\Visual Studio 2012\Projects\my_qt\my_qt\main.cpp   34  21  my_qt
 
 
    3   IntelliSense: оператор "this" можно использовать только внутри нестатической функции-члена    c:\Users\Admin\Documents\Visual Studio 2012\Projects\my_qt\my_qt\main.cpp   65  49  my_qt
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
02.02.2014, 14:08 6
mh-coder, label2 вообще не видно в твоем коде. Есть label, но и он определен вне класса и слот его не видит. То же самое с lineedit.
Про области видимости слыхал чего-нибудь?
1
MastAKK
02.02.2014, 14:21
  #7

Не по теме:

Перед тем,как лезть в Qt, изучи C++...

2
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
02.02.2014, 16:44 8
Цитата Сообщение от MastAKK Посмотреть сообщение
Слот ничего не должен возвращать, т.к. он лишь выполняется.
То, что слот "лишь выполняется" не значит, что из него нельзя вернуть значение.
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
02.02.2014, 16:49 9
Цитата Сообщение от fasked Посмотреть сообщение
То, что слот "лишь выполняется" не значит, что из него нельзя вернуть значение.
Не надо человека вводить в заблуждение, слот редко (по моим наблюдениям, может ошибаюсь) юзают как именно функцию, которая вохвоащает значения. Тем более, автор вообще систему сигналов-слотов не понимает и будет думать, что сonnect получает какие-то значение.

Не по теме:

Извиняюсь, если неправильно/непонятно мысль выразил, башка раскалывается

0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
08.02.2014, 21:16  [ТС] 10
Короче читал шлее, хотел испробывать его пример, написал код полностью как в примере, а мне в результате выдает ошибки содержимое которых мне непонятно

вот ошибки и код, хелпаните плыз

Lisp
1
2
3
4
5
6
7
Предупреждение    1   warning MSB8017: A circular dependency has been detected while executing custom build commands for item "GeneratedFiles\Debug\main.moc". This may cause incremental build to work incorrectly.  C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets  172 5   my_qt
Ошибка    2   error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual struct QMetaObject const * __thiscall Counter::metaObject(void)const " (?metaObject@Counter@@UBEPBUQMetaObject@@XZ)"   C:\Users\Admin\documents\visual studio 2012\Projects\my_qt\my_qt\main.obj   my_qt
Ошибка    3   error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void * __thiscall Counter::qt_metacast(char const *)" (?qt_metacast@Counter@@UAEPAXPBD@Z)" C:\Users\Admin\documents\visual studio 2012\Projects\my_qt\my_qt\main.obj   my_qt
Ошибка    4   error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual int __thiscall Counter::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Counter@@UAEHW4Call@QMetaObject@@HPAPAX@Z)"    C:\Users\Admin\documents\visual studio 2012\Projects\my_qt\my_qt\main.obj   my_qt
Ошибка    5   error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "public: void __thiscall Counter::goodbye(void)" (?goodbye@Counter@@QAEXXZ) т ЇєэъЎшш "public: void __thiscall Counter::slotInk(void)" (?slotInk@Counter@@QAEXXZ) C:\Users\Admin\documents\visual studio 2012\Projects\my_qt\my_qt\main.obj   my_qt
Ошибка    6   error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "public: void __thiscall Counter::counterChanged(int)" (?counterChanged@Counter@@QAEXH@Z) т ЇєэъЎшш "public: void __thiscall Counter::slotInk(void)" (?slotInk@Counter@@QAEXXZ)   C:\Users\Admin\documents\visual studio 2012\Projects\my_qt\my_qt\main.obj   my_qt
Ошибка    7   error LNK1120: эхЁрчЁх°хээ√ї тэх°эшї ¤ыхьхэЄют: 5 C:\Users\Admin\documents\visual studio 2012\Projects\my_qt\Win32\Debug\\my_qt.exe   my_qt


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
#include <QtGui/QFont>
#include <QtWidgets/QLabel>
 
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTextEdit>
 
 
 
 
#include <iostream>
#include <string>
 
 
 
using namespace std;
 
class Counter : public QObject  {
 
Q_OBJECT
 
private:
    int m_nValue;
 
public:
    Counter();
 
    public slots:
        void slotInk();
 
signals:
 
        void goodbye();
        void counterChanged(int);
 
 
};
 
Counter::Counter() : QObject() , m_nValue() {}
 
void Counter::slotInk() {
 
    emit counterChanged(m_nValue);
 
    if( m_nValue == 5)  
 
    {
        emit goodbye();
    }
 
 
}
 
 int main(int argc, char *argv[])
 
 {
     
 
     QApplication app(argc,argv);
 
     QLabel lbl("0");
 
    QPushButton cmd("ADD");
 
    Counter counter;
 
     lbl.show();
     cmd.show();
 
 
     QObject::connect(&cmd,SIGNAL(clicked()),&counter,SLOT(slotInc()));
 
     QObject::connect(&counter,SIGNAL(counterChanged()),&lbl,SLOT(setNum()));
 
     QObject::connect(&counter,SIGNAL(goodbye()),&app,SLOT(quit()));
 
 
 
     return app.exec();
    
 
     
 }
1
Заблокирован
08.02.2014, 22:59 11
mh-coder, номер листинга в книге?
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
08.02.2014, 23:00  [ТС] 12
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
mh-coder, номер листинга в книге?
60/ в реадере а в книге 52
0
Заблокирован
08.02.2014, 23:41 13
Это страницы, листинг 2.8 - 2.10.

Почему не компилируется ваш код я не скажу - в программировании разбираюсь слабо. Но если разнести его на разные файлы(counter.h, counter.cpp, main.cpp) этих ошибок не будет.

И еще, есть несколько несоответствий кода в листингах и у вас.

Добавлено через 18 минут
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef _Counter_h_ 
#define _Counter_h_ 
#include <QObject> 
// ====================================================================== 
class Counter : public QObject { 
Q_OBJECT 
private: 
int m_nValue; 
public: 
Counter(); 
public slots: 
void slotInc(); 
signals: 
void goodbye ( ); 
void counterChanged(int); 
}; 
#endif //_Counter_h_
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "counter.h"
 
Counter::Counter() : QObject() 
, m_nValue(0) 
{ 
} 
 
 
void Counter::slotInc() 
{ 
emit counterChanged(++m_nValue); 
if (m_nValue == 5) { 
emit goodbye(); 
} 
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "counter.h"
 
#include <QtGui> 
 int main(int argc, char *argv[])
{ 
QApplication app(argc, argv); 
QLabel lbl("0"); 
QPushButton cmd ("ADD") ; 
 
 
Counter counter; 
lbl.show(); 
cmd.show() ; 
QObject::connect(&cmd, SIGNAL(clicked()), 
&counter, SLOT (slotInc () ) 
); 
QObject::connect(&counter, SIGNAL(counterChanged(int)), 
&lbl, SLOT(setNum(int)) 
); 
QObject::connect(&counter, SIGNAL(goodbye()), 
&app, SLOT(quit()) 
); 
return app.exec(); 
}
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
08.02.2014, 23:51  [ТС] 14
разнёс на разные файлы, теперь пишет

Ошибка 1 error C1083: Не удается открыть файл включение: QObject: No such file or directory c:\users\admin\documents\visual studio 2012\projects\my_qt\my_qt\my_qt.h 6 1 my_qt

хотя при этом #include <QObject> не подчёркивает красным..
0
Автор FAQ
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
09.02.2014, 15:05 15
Вы бы написали какая у вас версия Qt для начала...
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
09.02.2014, 22:01  [ТС] 16
Цитата Сообщение от Чистый Посмотреть сообщение
Вы бы написали какая у вас версия Qt для начала...
qt 5.2 , visual studio 2012

Добавлено через 1 час 36 минут
в общем разобрался, нужно било и в правду разбросать всё по файлам, а для QObject нужно было просто правильно указать путь

Добавлено через 17 минут
я вот только непонял этой записи

C++ (Qt)
1
2
3
4
Counter::Counter() : QObject() 
, m_nValue(0) 
{ 
}
то что функция Counter() относится к классу Counter это понятно, что это за фигня? : QObject()
, m_nValue(0) и почему в скобках нечё нету?
0
0 / 0 / 0
Регистрация: 21.08.2015
Сообщений: 4
21.08.2015, 12:24 17
И всё же вернёмся к теме. Ни у Шлее ни у Дейтела не вижу ответа на свой простой вопрос - как описать и вызывать функцию?

Есть tabWidget, создаю новую вкладку по нажатию кнопки так:

C++
1
ui->tabWidget->addTab(new QWidget(),"name");
Нужно создать таб функцией, чтобы имя таба передать в качестве переменной. Уже голова пухнет.

из с++ помню function, но Qt не понимает этого слова.
0
59 / 46 / 11
Регистрация: 16.09.2014
Сообщений: 124
21.08.2015, 18:16 18

Не по теме:

Зачем вы лезете в QT без знаний С++?


Цитата Сообщение от Acies Посмотреть сообщение
из с++ помню function, но Qt не понимает этого слова.
в С++ нету служебного слова function.
Цитата Сообщение от Acies Посмотреть сообщение
Нужно создать таб функцией, чтобы имя таба передать в качестве переменной. Уже голова пухнет.
C++
1
2
3
void createAndSetNewTab(const QString & inTabName){
    ui->tabWidget->addTab(new QWidget(),inTabName);
}
1
0 / 0 / 0
Регистрация: 21.08.2015
Сообщений: 4
22.08.2015, 09:48 19
Pancir, спасибо большое за ответ.

Так тоже делал и получал ошибку 'ui' was not declarated in this scope, думал неверно вообще делаю.

В итоге получилось так:
Объявил функцию в заголовочном файле
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void on_pushButton_clicked();
 
    void on_pushButton_3_clicked();
 
    void createAndSetNewTab(const QString & inTabName); //объявление функции
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
Описал в СРР файле и в нём же вызвал по нажатию кнопки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
//описание функции
void MainWindow::createAndSetNewTab(const QString & inTabName){
    ui->tabWidget->addTab(new QWidget(),inTabName);
}
 
//вызов функции по нажатию кнопки
void MainWindow::on_pushButton_3_clicked()
{
  createAndSetNewTab(ui->lineEdit->text());
}
0
22.08.2015, 09:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2015, 09:48
Помогаю со студенческими работами здесь

QML при загрузке компонента вызвать javascript функцию
Я пишу игру на qml. Нужно сделать так что-бы при загрузке qml файла в котором содержится игровое...

Вызвать функцию рисования у класса наследующего QGLWidget из класса наследующего QWidget?
Пишу программу которая моделирует движение обьектов. Класс Display наследуется от QWidget и...

Как вызвать updateGL() из другого класса?
Есть два класса Draw(наследует от QGLWidget) и Calc(наследует QWidget) в разных файлах. Создал...

Как правильно вызвать поток в консольной программе
Всё! Совсем завяз, уже создал пустой проект, чтобы разобраться с этими потоками. Гугл уже снится,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru