Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4 / 4 / 3
Регистрация: 28.08.2017
Сообщений: 81
1

Не хочет читать this

12.03.2018, 12:35. Просмотров 930. Ответов 6
Метки нет (Все метки)

Создал специальный класс, для обработки БД, и тут столкнулся с проблемой, он ни в какую не хочет читать указатель на себя( this). Все connect с другими классами он воспринимает нормально, а вот connect с this не рассматривает. Не понимаю, что ему не нравится, слот есть, сигнал такой существует.
date_base.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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef DATE_BASE_H
#define DATE_BASE_H
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QSqlDriver>
#include <QSqlError>
#include <QSqlError>
#include <QDebug>
#include <QString>
#include <QToolBox>
#include <QAbstractButton>
#include <QVBoxLayout>
#include <QApplication>
#include <QStringList>
#include <QPushButton>
#include <QObject>
 
 
#include "mainwindow.h"
class date_base
{
 
public:
    date_base();
    QSqlDatabase db;
    void set_connection();
    void update_handbook();
    void setTableConnections(QTableView*);
    void handbook_del(QWidget* , QToolBox* , MainWindow*);
    void handbook(QToolBox*, MainWindow*);
    int CountTableConnections();
 
public slots:
private slots:
    void s_update(QString);
private:
signals:
    void signal_update();
};
 
#endif // DATE_BASE_H

date_base.cpp
Кликните здесь для просмотра всего текста
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
void date_base::set_connection()
{
    if(db.isValid() == true)
    {
        db = QSqlDatabase::database();
    }else{
        db = QSqlDatabase::addDatabase("QPSQL");
        db.setHostName("localhost");
        db.setPort(5432);
        db.setDatabaseName("postgres");
        db.setUserName("postgres");
        db.setPassword("rootuser");
    }
    db.open();
    if( db.isOpen() == true)
    {
        qDebug() << QObject::trUtf8("База данных успешно открыта");
 
    }else{
        qDebug() << QObject::trUtf8("Ошибка:") << db.lastError();
    }
 
    db.driver()->subscribeToNotification("number_insert");
    db.driver()->subscribeToNotification("number_delete");
    db.driver()->subscribeToNotification("number_update");
    db.driver()->subscribeToNotification("person_insert");
    db.driver()->subscribeToNotification("person_delete");
    db.driver()->subscribeToNotification("person_update");
    db.driver()->subscribeToNotification("add_connection");
    db.driver()->subscribeToNotification("update_connection");
    db.driver()->subscribeToNotification("remove_connection");
    QObject::connect(db.driver(), SIGNAL( notification(QString) ), this, SLOT( s_update(QString) ));    
 
}


Ну и сама ошибка
.../date_base.cpp:6: ошибка: no matching function for call to 'QObject::connect(QSqlDriver*, const char*, date_base*, const char*)'
QObject::connect(db.driver(), SIGNAL( notification(QString) ), this, SLOT( s_update(QString) ));
^
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2018, 12:35
Ответы с готовыми решениями:

Не хочет читать БД
Доброго времени! Установлен 1с 8.1+Зарплата и кадры бюдж учреждения. Странно как-то, но в начале...

file_get_contents() не хочет читать js
Так же есть вопрос по функции file_get_contents. Не могу получить код java script. например:...

девайс хочет читать вес.
Есть устр-во на mego32. Надо научить читать вес. Как это делается &quot;обычно&quot; ? Не имел опыта, да и...

Компилятор не хочет читать функиции.
Мой компилятор когда я визываю функцию пишет ошибку. Скажите что делать.

6
278 / 87 / 37
Регистрация: 10.06.2015
Сообщений: 261
12.03.2018, 12:55 2
Навскидку: Q_OBJECT добавь в описание класса.
0
4 / 4 / 3
Регистрация: 28.08.2017
Сообщений: 81
12.03.2018, 13:00  [ТС] 3
Lolobotik, пробовал, не зашло

Добавлено через 3 минуты
Сделал qDebug() << this;
Съел спокойно, а на connect ругается
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
12.03.2018, 13:29 4
Лучший ответ Сообщение было отмечено WhitePower_ как решение

Решение

Наверное, строковый connect работает только для наследников QObject. Наверное... Унаследуйтесь от QObject.
C++ (Qt)
1
2
3
class date_base /* : public QObject */
{ 
/* Q_OBJECT */
Или используйте ссылочный connect.
C++ (Qt)
1
connect(db.driver(), QSqlDatabase::notification, this, date_base::s_update);
Добавлено через 1 минуту
Конечно, slots: и signals: в данном контексте бессмысленны.
1
4 / 4 / 3
Регистрация: 28.08.2017
Сообщений: 81
12.03.2018, 13:33  [ТС] 5
icpu, сейчас попробую ссылочный, но connect в других случаях для этого класса работает. Например тут
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
void date_base::handbook(QToolBox *tool_box, MainWindow *w)
{
 //   QObject::connect(this, SIGNAL(signal_update()), w, SLOT(slot_update()));
   // signal_update();
    int p = tool_box->count();
    for(int i =0; i < p ; i++)
    {
        delete tool_box->widget(0);
    }
    QSqlQuery query;
    QSqlQuery query2;
    query.exec("SELECT _id_person, first_name, surname, patronymic, _position FROM handbook_person");
    while(query.next())
    {
        int id = query.value(0).toInt();
        QString first_name = query.value(1).toString();
        QString surname = query.value(2).toString();
        QString patronymic = query.value(3).toString();
        QString position = query.value(4).toString();
        QString full_name = surname + " " + first_name + " " + patronymic + " " + position;
        QWidget *page = new QWidget(tool_box);
        QVBoxLayout *page_layout = new QVBoxLayout(page);
        page_layout->setAlignment(Qt::AlignTop);
        page->setObjectName(QString::number(id) + "_" + first_name + "_" + surname + "_" + patronymic + "_" +position);
        page->setLayout(page_layout);
        tool_box->addItem(page, full_name);
        QAbstractButton *button = tool_box->findChild<QAbstractButton*>("qt_toolbox_toolboxbutton");
        button->setObjectName("button_" + QString::number(id) + "_" + first_name + "_" + surname + "_" + patronymic + "_" +position);
        button->setMinimumHeight(31);
        query2.exec("SELECT _number, _type FROM handbook_number WHERE _id_person =" + QString::number(id));
        while(query2.next())
        {
            QString num = query2.value(0).toString();
            QString type = query2.value(1).toString();
            QPushButton *button = new QPushButton(type+ " " + num, page);
            button->setObjectName(type + "_" + num);
            page_layout->addWidget(button);
            QObject::connect(button, SIGNAL(clicked()), w , SLOT(slot_spravochnik_shk()));
        }
    }
}
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
12.03.2018, 13:40 6
Лучший ответ Сообщение было отмечено WhitePower_ как решение

Решение

WhitePower_, QPushButton и MainWindow - это не date_base.
C++ (Qt)
1
//   QObject::connect(this, SIGNAL(signal_update()), w, SLOT(slot_update()));
Не просто так же эта строчка забальзамирована.
1
4 / 4 / 3
Регистрация: 28.08.2017
Сообщений: 81
12.03.2018, 14:06  [ТС] 7
icpu, как обычно, сначала отослал, потом подумал xD Не получается унаследовать QObject.
C++ (Qt)
1
2
3
4
class date_base : public QObject
{
    Q_OBJECT
}
Дает ошибку на класс и на конструктор класса
ошибка: undefined reference to `vtable for date_base'

Добавлено через 22 минуты
icpu, ваш совет помог, если бы не проблемы с пересобиранием проекта, сделал бы намного раньше. Пробовал унаследоваться, но ошибка не уходила. Подумал, что не выход и ушел от этого. А сейчас очистил проект, запустил qmake и все заработало
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2018, 14:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

IE не хочет читать сайт https
IE не хочет читать сайт https. как быть?

Exitcode 2. Не хочет читать процедуру
Когда я в меню нажимаю на процедуру открытие, у меня она автоматически закрывается с кодом exitcode...

Sony DVD RW не хочет читать CD
SOS!!!! Sony DVD RW DW Q28A НЕ ХОЧЕТ ЧИТАТЬ CD диски, в смысле диск разгоняет и все. помогите можно...

Не работает программа. Не хочет читать файл
Нехочет читать файл, пишет error C2660: 'fopen_s' : function does not take 2 arguments #include...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.