Russian Qt Forum

Qt => Работа с сетью => Тема начата: Dzi777 от Ноябрь 27, 2016, 23:52



Название: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Ноябрь 27, 2016, 23:52
no such slots  программа компилирует, но после изменения ссылки нечего не происходит.....
QT 5.7
api.pro
------------

QT       += core gui webenginecore webenginewidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = api
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp \
    vkapiwin.cpp
HEADERS  +=main.cpp\
    mainwindow.h \
    vkapiwin.h
FORMS    += mainwindow.ui \
    vkapiwin.ui
-------------------------------------
main.cpp
Код:
#include "mainwindow.h"
#include <QApplication>
#include <QtWebEngineCore>
#include <QtWebEngineWidgets>
#include <QUrl>
#include <QString>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    QString token;
    QString id;
    w.show();
    return a.exec();
}
mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "string.h"
#include "vkapiwin.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    vkapiwin *vkapi;
};

#endif // MAINWINDOW_H
vkapiwin.h
Код:
#ifndef VKAPIWIN_H
#define VKAPIWIN_H

#include <QWidget>

namespace Ui {
class vkapiwin;
}

class vkapiwin : public QWidget
{
    Q_OBJECT

public:
    explicit vkapiwin(QWidget *parent = 0);
    ~vkapiwin();
    Ui::vkapiwin *ui;
public slots:
    virtual void check_url(QUrl &url,QString &token,QString &id);
};

#endif // VKAPIWIN_H
main window.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "vkapiwin.h"
#include <QUrlQuery>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_2_clicked()
{
 vkapiwin *vkapi= new vkapiwin();
 vkapi->show();
 if (vkapi == NULL)
 {
     vkapi->hide();
     this->show();
 }
}

void MainWindow::on_pushButton_clicked()
{
   ............
}
vkapiwin.cpp
Код:
#include "vkapiwin.h"
#include "ui_vkapiwin.h"
#include <QUrlQuery>
#include <QSsl>
#include <QWidget>

vkapiwin::vkapiwin(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::vkapiwin)
{
    ui->setupUi(this);
    ui->preview->load(QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456"));
    connect(ui->preview,SIGNAL(urlChanged(QUrl)),this,SLOT(check_url(QUrl,token,id)));
    ui->preview->show();
}

vkapiwin::~vkapiwin()
{
    delete ui;
}
void vkapiwin::check_url(QUrl &url,QString &token,QString &id)
{
    url = url.toString().replace("#","?");
    token = QUrlQuery(url).queryItemValue("access_token");
    id = QUrlQuery(url).queryItemValue("user_id");
}
после компиляции пушит
QML debugging is enabled. Only use this in a safe environment.
QObject::connect: No such slot vkapiwin::check_url(QUrl,token,id) in ../api/vkapiwin.cpp:13
QObject::connect:  (sender name:   'preview')
QObject::connect:  (receiver name: 'vkapiwin')


Название: Re: Делаю vk api ошибка no such slots
Отправлено: ssoft от Ноябрь 28, 2016, 07:47
Все правильно пишет) Слот имеет не такую сигнатуру, должно быть

Код
C++ (Qt)
connect(ui->preview,SIGNAL(urlChanged(QUrl)),this,SLOT(check_url(QUrl,QString,QString)));
 


Название: Re: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Ноябрь 28, 2016, 10:38
Все правильно пишет) Слот имеет не такую сигнатуру, должно быть

Код
C++ (Qt)
connect(ui->preview,SIGNAL(urlChanged(QUrl)),this,SLOT(check_url(QUrl,QString,QString)));
 
Не помогло......Есть еще идеи?Но слот я неправильно подключал.


Название: Re: Делаю vk api ошибка no such slots
Отправлено: gil9red от Ноябрь 28, 2016, 11:36
И добавьте в поля класса token и id

Код
C++ (Qt)
connect(ui->preview,SIGNAL(urlChanged(QUrl)),this,SLOT(check_url(QUrl)));
 
и
 
void vkapiwin::check_url(QUrl url) {
   url = url.toString().replace("#","?");
   this->token = QUrlQuery(url).queryItemValue("access_token");
   this->id = QUrlQuery(url).queryItemValue("user_id");
}
 


Название: Re: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Ноябрь 28, 2016, 18:55
И добавьте в поля класса token и id

Код
C++ (Qt)
connect(ui->preview,SIGNAL(urlChanged(QUrl)),this,SLOT(check_url(QUrl)));
 
и
 
void vkapiwin::check_url(QUrl url) {
   url = url.toString().replace("#","?");
   this->token = QUrlQuery(url).queryItemValue("access_token");
   this->id = QUrlQuery(url).queryItemValue("user_id");
}
 
Не помогло.......(и так переменные записать не получилось :( )


Название: Re: Делаю vk api ошибка no such slots
Отправлено: gil9red от Ноябрь 29, 2016, 08:21
А такая замена в лоб и не поможет -- нужно код еще закончить -- в заголовочнике поменять описание функции check_url, добавить поля token и id, подкорректировать (наверное) алгоритм использования vkapiwin, например после того как функция будет вызвана и заполнит те поля еще и отправляем сигнал, мол данные получены.


Название: Re: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Ноябрь 29, 2016, 10:02
А такая замена в лоб и не поможет -- нужно код еще закончить -- в заголовочнике поменять описание функции check_url, добавить поля token и id, подкорректировать (наверное) алгоритм использования vkapiwin, например после того как функция будет вызвана и заполнит те поля еще и отправляем сигнал, мол данные получены.
Я все исправил в заголовочном файле(изменил описание функции check_url и добавил token и id в класс), но это не помогло.
Программа не хочет брать данные.
Код:
void vkapiwin::check_url(QUrl &url)
{
    QString url1 = url.toString().replace("#","?");
    this->token = QUrlQuery(url1).queryItemValue("access_token");
    this->id = QUrlQuery(url1).queryItemValue("user_id");
}
попробовал так тоже не помогло.....


Название: Re: Делаю vk api ошибка no such slots
Отправлено: kambala от Ноябрь 29, 2016, 12:41
а ссылка-то хоть правильная приходит? добавь печать / посмотри через дебаггер


Название: Re: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Ноябрь 29, 2016, 22:58
а ссылка-то хоть правильная приходит? добавь печать / посмотри через дебаггер
Ссылка вообще не приходит. Хотя вроде должна приходить.


Название: Re: Делаю vk api ошибка no such slots
Отправлено: kambala от Ноябрь 30, 2016, 16:09
попробуй прописать коннект до вызова ui->preview->load()


Название: Re: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Ноябрь 30, 2016, 20:12
попробуй прописать коннект до вызова ui->preview->load()
]по моему это не имеет смысла....(но  я попробовал (не помогло)).


Название: Re: Делаю vk api ошибка no such slots
Отправлено: kambala от Декабрь 01, 2016, 01:36
у меня все работает в обоих вариантах, Qt 5.6.2, Mac OS X 10.11:
Код
C++ (Qt)
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include <QWebEngineView>
 
class A : public QObject
{
   Q_OBJECT
 
public slots:
   void printUrl(const QUrl &url) { qDebug() << "from A:" << url; }
};
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   QWebEngineView w;
   A a;
   QObject::connect(&w, SIGNAL(urlChanged(QUrl)), &a, SLOT(printUrl(QUrl)));
   QObject::connect(&w, &QWebEngineView::urlChanged, [](const QUrl &url){ qDebug() << "from lambda:" << url; });
   w.load(QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456"));
   w.show();
 
   return app.exec();
}
 
#include "main.moc"

вывод:
Цитировать
from A: QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456")
from lambda: QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456")
js: Uncaught ReferenceError: vkNow is not defined


Название: Re: Делаю vk api ошибка no such slots
Отправлено: Dzi777 от Декабрь 01, 2016, 09:45
у меня все работает в обоих вариантах, Qt 5.6.2, Mac OS X 10.11:
Код
C++ (Qt)
#include <QtCore>
#include <QtGui>
#include <QtWidgets>
#include <QWebEngineView>
 
class A : public QObject
{
   Q_OBJECT
 
public slots:
   void printUrl(const QUrl &url) { qDebug() << "from A:" << url; }
};
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   QWebEngineView w;
   A a;
   QObject::connect(&w, SIGNAL(urlChanged(QUrl)), &a, SLOT(printUrl(QUrl)));
   QObject::connect(&w, &QWebEngineView::urlChanged, [](const QUrl &url){ qDebug() << "from lambda:" << url; });
   w.load(QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456"));
   w.show();
 
   return app.exec();
}
 
#include "main.moc"

вывод:
Цитировать
from A: QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456")
from lambda: QUrl("https://oauth.vk.com/authorize?client_id=5681259&display=mobile&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.60&state=123456")
js: Uncaught ReferenceError: vkNow is not defined
У меня проблема в том, что он не получает ссылку в connect"е.(Или он его неправильно обрабатывает(что мало вероятно)).


Название: Re: Делаю vk api ошибка no such slots
Отправлено: kambala от Декабрь 01, 2016, 17:49
ну этот тестовый пример сработал у тебя?

выкладывай полный проект, посмотрим.