1

QMainWindowを処理する「コア」オブジェクトがあります。
Core.hコード

class Core : public QObject
{
    Q_OBJECT
public:
    explicit Core(QObject *parent = 0);
    ~Core();
    void appInit();
    int getAuth();

public slots:
    void appExit();

private slots:
    void appMenuTriggered(QAction *action);

private:
    void preInit();
    MainWindow *mwnd;
};

Core.cppコード

Core::Core(QObject *parent) : QObject(parent)
{
    qDebug() << "Core::Constructor called";
    preInit();
}

Core::~Core()
{
    delete mwnd;
    qDebug() << "Core::Destructor called";
}

int Core::getAuth()
{
    LoginDialog *login = new LoginDialog();
    int r = login->exec();
    delete login;
    return r;
}

void Core::appExit() // connected to qapplication aboutToQuit
{
    qDebug() << "Core::appExit called";
}

void Core::preInit()  // called after getAuth im main.cpp
{
    qDebug() << "Core::preInit called";
}

void Core::appMenuTriggered( QAction *action )
{
    qDebug() << "action triggered";
}

void Core::appInit()
{
    mwnd = new MainWindow();
    mwnd->show();
    qDebug() << "Core::appInit called";
}

メインウィンドウのメニューバー信号を次のようにコアスロットに接続しようとしています。

connect(mwnd->menuBar(), SIGNAL(triggered()), this, SLOT(appMenuTriggered()));

しかし、それは機能しません。私はC++とQtに不慣れです。これを接続する方法は?あるいは、他のプログラム部分に対するメインウィンドウアクションを処理するためのより良い方法があるかもしれません。

UPD の問題は解決しました。QMenuBarを含めるのを忘れる

4

1 に答える 1

7

SIGNALパラメーターとSLOTパラメーターで完全な関数仕様を指定する必要があります(ただし、引数名は指定しないでください)。このような:

connect(mwnd->menuBar(),
        SIGNAL(triggered(QAction*)),
        this,
        SLOT(appMenuTriggered(QAction*)));

Qt Creatorでこのようなコードをデバッグconnectすると、シグナルまたはスロットが見つからない場合、関数は診断エラーメッセージを[アプリケーション出力]ペインに書き込みます。問題を修正する前にこれらのエラーメッセージを見つけて、将来どこを見ればよいかを知ることをお勧めします。信号とスロットを間違えるのは非常に簡単です!

于 2011-11-24T08:31:03.580 に答える