Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
1

Ошибка при сборке проекта - invalid use of non-static data member 'MainWindow::test'

20.04.2015, 11:49. Показов 5760. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно, сабж. Собираю в QtCreator, но по-моему ошибка не имеет к нему никакого отношения. Возможно я просто не понимаю, как правильно обращаться в потоке к одному из трех QLineEdit на форме. Я решил пойти через указатели, но при передаче указателя выдает ошибку. Явно что-то делаю не так, но пока что сам не смог разобраться...

mainwindow.h:
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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "hidapi.h"
#include "ui_mainwindow.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    QLineEdit* test;
    ~MainWindow();
    void SetTextToLineEdit(QLineEdit* LineEditName, QString Text);
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
mainwindow.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QLineEdit* test;// = ui->lineEdit;
}
 
void SetTextToLineEdit(QLineEdit* test, QString Text)
{
    test->setText(Text);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
mythread.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QtCore>
 
 
class MyThread : public QThread
{
public:
    MyThread();
    void run();
    ~MyThread();
};
 
#endif // MYTHREAD_H
mythread.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "mythread.h"
#include <mainwindow.h>
#include <ui_mainwindow.h>
 
 
MyThread::MyThread()
{
 
}
 
void MyThread::run()
{
    MainWindow::SetTextToLineEdit(MainWindow::test,"123");
}
 
MyThread::~MyThread()
{
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2015, 11:49
Ответы с готовыми решениями:

Массив в классе. Ошибка error: invalid use of non-static data member
class MyClass { // ... private: int mont; // число дней в месяце int days;...

Массив в структуре. invalid use of non-static data member
Добрый день. Есть структура, понадобилось добавить в неё массив с дин. размером. struct MyStruct...

Ошибка: invalid use of non-static member function
#include &lt;iostream&gt; using namespace std; class fraction { fraction(double var_sum) {

Ошибки: "invalid use of non-static data member", "error: from this location"
Здравствуйте. Помогите пожалуйста понять в чём я не прав. Почему компилятор не даёт объявить...

18
Заблокирован
20.04.2015, 12:09 2
Цитата Сообщение от Горбаг Посмотреть сообщение
MainWindow::SetTextToLineEdit(MainWindow::test,"123");
Ну тут вообще ересь Сразу видно, что ты не знаешь, что такое static
1. У тебя void SetTextToLineEdit(QLineEdit* LineEditName, QString Text); объявлена как обычная функция (без static), так какого хрена ты её пытаешься как статическую в потоке вызвать ?
C++
1
2
3
4
void MyThread::run()
{
    MainWindow::SetTextToLineEdit(MainWindow::test,"123");
}
2. Что ты пытаешься передать в качестве первого аргумента в функцию? Ну вот что? Сам то понимаешь?
Если ты хочешь передать переменную - член класса, которая у тебя является указателем на QLineEdit, тебе сначала нужно создать объект своего класса - MainWindow* mw = new MainWindow; а потом уже пытаться что то делать со своей переменной: mw->test
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 12:20  [ТС] 3
VoodooPuppet, Догадываюсь, что ересь...

Правильный код mainwindow.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    test = ui->lineEdit;
}
//ThreadAutorisation thread;
 
void SetTextToLineEdit(QLineEdit* test, QString Text)
{
    test->setText(Text);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
В данном случае передается указатель на графический элемент формы - ТексБокс грубо говоря. И функция должна в этот текстбокс добавить переданный текст. Но реализую я это криво...
0
Заблокирован
20.04.2015, 12:30 4
Где ты создаёшь объект класса MainWindow ? Он у тебя один?
Что ты хочешь сделать из разных потоков? Хочешь текст менять?
Если да, то передавай скажем в конструктор класса - потока указатель на объект MainWindow
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
class MyThread : public QThread
{
public:
    MyThread(MainWindow* _mw);
    void run();
    ~MyThread();
private:
    MainWindow* mw = nullptr;
};
 
MyThread::MyThread(MainWindow* _mw) : mw(_mw)
{ 
}
 
void MyThread::run()
{
    Q_ASSERT(mw);
    mw->SetTextToLineEdit("123");
}
 
........
void SetTextToLineEdit(QString Text)
{
    test->setText(Text);
}
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 12:38  [ТС] 5
Есть форма с тремя полями.
При старте программы показывается форма и запускается поток.
В потоке идет прием датаграмм с usb устройства.
Как только нужная датаграмма получена, поток возвращает данные.
И теперь мне как раз и нужна функция, вносящая полученные из потока данные в форму.

Я же вроде бы привел файлы в самом начале. Их не хватает? Вроде бы в них все действия указаны.
0
Заблокирован
20.04.2015, 12:52 6
Цитата Сообщение от Горбаг Посмотреть сообщение
Их не хватает?
Да.... там ДЖИ код

В общем смотри что тебе нужно сделать:
1. В классе формы сделай слот типа этого: OnSetTextToLineEdit(QString message);
2. В классе потока сделай сигнал void SetTextToLineEdit(QString message);
3. При старте программы, где ты создаёшь и показываешь свою форму, там же создавай объект класса потока, связывай его сигнал SetTextToLineEdit со слотом класса MainWidnow - OnSetTextToLineEdit. Запускай поток.
4. В потоке, при получение данных, емить сигнал SetTextToLineEdit с нужной строкой.
5. В MainWindow выставляй значение по принятой строке.

P.S.: Не забудь в свойствах соединения сигнала и слота указать Qt::QueuedConnection, т.к. объекты находятся в разных потоках
1
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 12:58  [ТС] 7
Пока что я не приступал к приему данных. Поигрался - устройство видится и в блок обработки входных данных попадаем. На этом остановился, код вырезал.

Сейчас я просто пытаюсь сделать функцию редактирования текстбокса. В нее передаем текстбокс и текст. Форма обновляется.

Но пока что я не понимаю, как мне использовать приведенные вами инструкции.
0
Заблокирован
20.04.2015, 13:02 8
Цитата Сообщение от Горбаг Посмотреть сообщение
Сейчас я просто пытаюсь сделать функцию редактирования текстбокса. В нее передаем текстбокс и текст. Форма обновляется.
Эта функция - член класса MainWindow? Зачем в неё указатель на текстбокс передавать, если этот указатель и так хранится как свойство класса?
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 13:20  [ТС] 9
Функция - член класса MainWindow.
Указатель тоже член класса:

C++ (Qt)
1
2
3
4
5
public:
...
    QLineEdit* test;
...
    void SetTextToLineEdit(QLineEdit* LineEditName, QString Text);
Однако, если в файле mythread.cpp оставить так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "mythread.h"
//#include <QtCore>
#include <mainwindow.h>
#include <ui_mainwindow.h>
 
 
MyThread::MyThread()
{
 
}
 
void MyThread::run()
{
    //MainWindow* mw = new MainWindow;
    SetTextToLineEdit(test,"123");
}
 
MyThread::~MyThread()
{
 
}
То получаю ошибку:

C++ (Qt)
1
2
'test' was not declared in this scope
'SetTextToLineEdit' was not declared in this scope
И именно из-за этой ошибки я дописывал перед ними "MainWindow::", провоцируя тем самым новую ошибку.

Если остановиться на таком вызове функции в потоке:
C++ (Qt)
1
    SetTextToLineEdit(test,"123");
То, что я сделал неправильно? Почему появляются ошибки, словно я не объявил ни функцию, ни переменную указателя?
0
Заблокирован
20.04.2015, 13:32 10
Цитата Сообщение от Горбаг Посмотреть сообщение
И именно из-за этой ошибки я дописывал перед ними "MainWindow::", провоцируя тем самым новую ошибку.

Ну просто ты не знаешь С++. В этом вся и загвоздка... Думаю, рановато в Qt полез ...
Ладно, так и быть - ща пример накидаю, жди ....
0
Заблокирован
20.04.2015, 13:41 11
Лучший ответ Сообщение было отмечено Горбаг как решение

Решение

Держи архив с примером
Вложения
Тип файла: rar Demo.rar (3.6 Кб, 29 просмотров)
1
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 13:44  [ТС] 12
Буду премного благодарен.

Я действительно не знаю C++, есть некие зачаточные знания, но в узких вопросах какой-то пробел. А проблемы сейчас у меня только потому, что устроился стажером в одну фирму... Ожидал какого-то обучения. А на деле все иначе. Есть задача - делай, как хочешь. Приходится крутиться и учиться самостоятельно и тратить еще и свободные вечера и выходные. Но, беда как раз в том, что времени учить толком нет - нужно кодить, ибо требуют результат. Как-то так.

Но меня больше все таки пугает логика. В одной файле объявил функцию и указатель. В другом файле подключил первый файл и воспользовался функцией. А он, зараза, ругается. Вроде бы всю жизнь так было, но тут какой-то затык.
0
Заблокирован
20.04.2015, 14:06 13
Цитата Сообщение от Горбаг Посмотреть сообщение
что устроился стажером в одну фирму.
А... я то думал ты очередной халявщик - студент, который тут в наглую требует сделать за него его же лабораторную или курсовую ...
Тогда уважуха тебе. Спрашивай, что не понятно. Пример я тебе дал, разобрался?
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 14:26  [ТС] 14
Перенес себе, ошибка:
C++ (Qt)
1
/home/gorbag/Qt5.4.1/5.4/gcc/include/QtCore/qobject.h:220: ошибка: invalid application of 'sizeof' to incomplete type 'QStaticAssertFailure<false>'
Пока гуглю...

Однако, к сабжу - а если все-таки пойти НЕ через сигналы/слоты? Как исправить именно тот код, который я выкладывал выше?
0
Заблокирован
20.04.2015, 14:33 15
Цитата Сообщение от Горбаг Посмотреть сообщение
Перенес себе, ошибка:
Попробуй создай у себя новый Widget проект и перенеси в него мой код. Там кода то с гулькин нос

Цитата Сообщение от Горбаг Посмотреть сообщение
а если все-таки пойти НЕ через сигналы/слоты? Как исправить именно тот код, который я выкладывал выше?
Никак. Там ряд фатальных ошибок, вызванных не пониманием языка С++.
Делай, как я тебе сказал.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 14:42  [ТС] 16
Дико извиняюсь.
Погуглил, ничего не нашел. Вернулся к ошибке - стал внимательно читать строку и, что необычно, в ней же и нашел решение:
C++ (Qt)
1
2
Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
                          "No Q_OBJECT in the class with the signal");
Криво переносил ваш пример. Добавил Q_OBJECT в mythread.h и пересобрал проект - все хорошо.

Но все-таки немного жаль, что вы не можете привести именно мой код в исправленном виде или пнуть меня в верном направлении =)
0
Заблокирован
20.04.2015, 14:58 17
Цитата Сообщение от Горбаг Посмотреть сообщение
Криво переносил ваш пример.
Как это криво? После того как ты разархивировал проект и открыл его в QtCreator-е, ты специально стёр Q_OBJECT и потом про это забыл ?

Цитата Сообщение от Горбаг Посмотреть сообщение
Но все-таки немного жаль, что вы не можете привести именно мой код в исправленном виде или пнуть меня в верном направлении =)
Да могу, почему нет. Я ж тебе сказал, тебе нужен указатель на объект MainWindow (который у тебя один) в классе потока, можешь его в конструкторе передавать и уже в функции Run вызывать нужную функцию через этот указатель. Но это неправильный подход без синхронизации доступа к твоему QLineEdit-у, хотя в случае одного дополнительного потока будет работать.
0
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 828
20.04.2015, 15:07  [ТС] 18
Грустно, но мне сложно ухватить суть.
Лучше мне будет подучить плюсы, да как следует - у меня явные пробелы с азами. А пока буду просто пользоваться вашим решением - уже подогнал его под прием данных с usb. Большое спасибо за помощь.

З.Ы. А переносил руками - открывал файлы, анализировал код и переносил. Потому и забыл одну строчку. Да и к тому же - открывал на главном компе, лениво было переносить на виртуалку дебиана через дропбокс =)
0
Заблокирован
20.04.2015, 15:09 19
Цитата Сообщение от Горбаг Посмотреть сообщение
Лучше мне будет подучить плюсы
Да, обязательно нужно. Тогда подобные вопросы сами будут отпадать...
0
20.04.2015, 15:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2015, 15:09
Помогаю со студенческими работами здесь

Ошибка "non-static data member initializers only available with -std=c++11 or -std=gnu++11"
Компилирую вот этот код: #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;set&gt; #include...

Widgets, ошибка: 'class Ui::MainWindow' has no member named <...>
Добрый день! Пишу приложение QtWidgets и столкнулся со следующей проблемой: ...

Ошибка при сборке: Invalid parameter passed to C runtime function
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; typedef unsigned long int uint;...

Ошибка при сборке проекта
Доброго дня, уважаемые форумчане. Имеется проект на гите созданый на VS Community 2015. После...


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

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