3

Qt の個人プロジェクトに TeamSpeak SDK を使用しようとしていますが、このコードをメインで使用すると正常に動作します

問題なくコンパイルされます。問題は、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

メインウィンドウ.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 でエラーが発生した行と次のエラーについてコメントしました。

型 'void (MainWindow::)(uint64, anyID, uint64, unsigned int*) から 'MainWindow::onClientConnected' を変換できません {aka void (MainWindow::)(long long unsigned int, short unsigned int, long long unsigned int , unsigned int*)}' を 'void ( )(uint64, anyID, uint64, unsigned int ) {aka void ( )(long long unsigned int, short unsigned int, long long unsigned int, unsigned int )}' 関数と入力します。 onClientConnected = onClientConnected; ^

Windows 10 Mingw コンパイラ Qt 5.6.1
を使用していますが、このコールバック関数を oop c++​​ で使用するにはどうすればよいですか?

4

2 に答える 2

2

Qt で TeamSpeak を使用する問題を解決しました。main.cpp でサーバーを初期化し、すべてのコールバック関数を構造体に割り当てます。たとえば、チャネルを表示する場合は、メイン ウィンドウでサーバーの任意の関数を使用できます。テキスト編集では、任意の c++ クラスまたは Qt ダイアログでその関数を使用し、問題なく 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を使用して、より良い答えがある場合はサーバー編集機能のみが必要です。投稿してくださいありがとう 編集
別の解決策は、メインのコールバック関数で構造体を初期化し、コンストラクターのメインウィンドウまたは任意のc ++クラスに渡し、それを使用してTeamSpeak のサーバー ライブラリを初期化する

于 2016-09-30T21:45:01.280 に答える