Я пытаюсь использовать TeamSpeak SDK для личного проекта в Qt, когда я использую этот код в основном, он работает нормально
Компилируется без проблем. Проблема в том, когда я использую его в Qt Mainwindow:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <teamspeak/public_definitions.h>
#include <teamspeak/public_errors.h>
#include <teamspeak/serverlib_publicdefinitions.h>
#include <teamspeak/serverlib.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
void onClientConnected(uint64 serverID, anyID clientID, uint64 channelID, unsigned int* removeClientError);
ServerLibFunctions funcs; // it's a struct that have pointer fucntions
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
funcs.onClientConnected = onClientConnected; // error here
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onClientConnected(uint64 serverID, anyID clientID, uint64 channelID, unsigned int* removeClientError) {
char* clientName;
unsigned int error;
/* Query client nickname */
if ((error = ts3server_getClientVariableAsString(serverID, clientID, CLIENT_NICKNAME, &clientName)) != ERROR_ok) {
char* errormsg;
if (ts3server_getGlobalErrorMessage(error, &errormsg) == ERROR_ok) {
printf("Error querying client nickname: %s\n", errormsg);
ts3server_freeMemory(errormsg);
}
return;
}
printf("Client '%s' joined channel %llu on virtual server %llu\n", clientName, (unsigned long long) channelID, (unsigned long long)serverID);
/* Example: Kick clients with nickname "BlockMe from server */
if (!strcmp(clientName, "BlockMe")) {
printf("Blocking bad client!\n");
*removeClientError = ERROR_client_not_logged_in; /* Give a reason */
}
}
Я прокомментировал строку, я получил ошибку в Mainwindow.cpp
и ошибка:
невозможно преобразовать ‘MainWindow :: onClientConnected’ из типа ‘void (MainWindow ::) (uint64, anyID, uint64, unsigned int *) {aka void (MainWindow ::) (длинный длинный unsigned int, короткий длинный unsigned int, длинный длинный unsigned int , unsigned int *)} ‘для ввода’ void () (uint64, anyID, uint64, без знака int) {aka void () (long long unsigned int, short unsigned int, long long unsigned int, unsigned int)}»
funcs.onClientConnected = onClientConnected;
^
Я использую компилятор Windows 10 Mingw Qt 5.6.1
Как я могу использовать эту функцию обратного вызова в OOP C ++
Я решаю свою проблему использования TeamSpeak в Qt. Я инициализирую сервер в main.cpp и назначаю все функции обратного вызова в структуре, и теперь я могу использовать любую функцию сервера в главном окне, например, если я хочу показать каналы в текстовом редакторе я использую функцию этого в любом классе C ++ или Qt Dialog, и я могу вызвать его без проблем
код main.cpp
// put the fucntion of the call back here
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
char *version;
short abort = 0;
uint64 serverID;
unsigned int error;
int unknownInput = 0;
uint64* ids;
int i;
struct ServerLibFunctions funcs;
/* Initialize all callbacks with NULL */
memset(&funcs, 0, sizeof(struct ServerLibFunctions));
funcs.onClientConnected = onClientConnected;
funcs.onClientDisconnected = onClientDisconnected;
funcs.onClientMoved = onClientMoved;
funcs.onChannelCreated = onChannelCreated;
funcs.onChannelEdited = onChannelEdited;
funcs.onChannelDeleted = onChannelDeleted;
funcs.onServerTextMessageEvent = onServerTextMessageEvent;
funcs.onChannelTextMessageEvent = onChannelTextMessageEvent;
funcs.onUserLoggingMessageEvent = onUserLoggingMessageEvent;
funcs.onClientStartTalkingEvent = onClientStartTalkingEvent;
funcs.onClientStopTalkingEvent = onClientStopTalkingEvent;
funcs.onAccountingErrorEvent = onAccountingErrorEvent;
funcs.onCustomPacketEncryptEvent = nullptr;
funcs.onCustomPacketDecryptEvent = nullptr;
if((error = ts3server_initServerLib(&funcs, LogType_FILE | LogType_CONSOLE | LogType_USERLOGGING, NULL)) != ERROR_ok) {
char* errormsg;
if(ts3server_getGlobalErrorMessage(error, &errormsg) == ERROR_ok) {
printf("Error initialzing serverlib: %s\n", errormsg);
ts3server_freeMemory(errormsg);
}
return 1;
}
MainWindow w;
w.show();
return a.exec();
// use any function to edit server in any c++ class as show chan add chancel and so on
}
Используйте все функции для редактирования сервера в любом классе C ++, он будет работать, и я думаю, что нам не нужно инициализировать сервер более одного раза в основном, и нам не нужно, но это в классе, и если я хочу сделать VoIP используя Qt GUI нам нужна только функция редактирования сервера, если есть лучший ответ, пожалуйста, отправьте его Спасибо
редактировать
другое решение — инициализировать структуру с помощью функций обратного вызова в main и передать ее в Mainwindow или любой класс c ++ в конструкторе и использовать его для инициализации lib сервера TeamSpeak.
Ваш вопрос может быть смоделирован с помощью простого кода ниже.
Исходя из моего понимания, функция, которую вы пытаетесь назначить, является членом класса. Таким образом, компилятор считает это несоответствием подписи, когда вы пытаетесь назначить.
Возможно, вам придется написать необходимую функциональность в не член класса, а затем назначить. (если нет способа разрешить это назначение).
Создайте структуру с входами функций в качестве друга вашего функционального класса, как показано ниже.
#include <iostream>
// common namespace
using namespace std;//Structure with function pointers.
struct funcPtrStruct
{
public:
void (*func)(int a, float b);
};//The non member function that address your functionality
void testFuncOne(int a ,float b)
{
//Do something
}//Class implementation
class Test
{
public:
Test()
{
funcPtrStruct funPtrSt;
//func = &testFunc; //Here the error is shown " a value of type .....can not convert......"funPtrSt.func = &testFuncOne; //This is working but it is not a class memeber.
}
private:
friend struct funcPtrStruct; //Make the structure of function pointers as your friend.
};int main() {
return 0;
}