0

どのウィンドウがアクティブで、いつ変更されたかをログに記録する、linux/mac/windows 用のアプリを作成したいと考えています。すべてのデータはテキスト ファイルに書き込む必要があります。

アクティブなウィンドウのタイトルを出力するためだけにこのコードを使用しようとしていました:

QDebug << "アクティブ ウィンドウ: " << QApplication::activeWindow()->windowTitle();

私の含まれるもの:

QApplication QWidget QtGui/QApplication qmlapplicationviewer.h QDebug

QApplication::activeWindow()->windowTitle() を呼び出すと、エラーが発生します (アプリケーション出力):

プログラムが予期せず終了しました。

どうしたの?

コードにUubuntu 32ビットを使用し、QT 4.8.0(32ビット)に基づくQT Creator v2.4.1を使用しています

私の完全なコード: http://pastebin.com/J97rJv5a

4

1 に答える 1

0

このmainメソッドは、アプリケーションの起動ごとに 1 回だけ実行されます。何かを監視する場合は、スロットとシグナル メカニズムを使用して実行する必要があります。カスタムクラスを定義して (または、QApplication 自体をサブクラス化することもできます)、それを QApplication::focusChanged シグナルに接続することで、これを実現できます。アプリケーションのフォーカスが変わるたびに、シグナルを受け取ります。これはmain.cpp

#include <QtGui>
#include <QDeclarativeView>

#include "main.h"

Watcher::Watcher(QObject *parent)
  : QObject(parent)
{
}

void Watcher::onFocusChanged(QWidget * old, QWidget * now)
{
    Q_UNUSED(old);

    QWidget * window;
    if (now == 0) {
        window = 0;
    } else {
        window = now->window();
    }

    if (window != 0) {
        qDebug() << window->windowTitle();
    } else {
        qDebug() << "No active window";
    }
}

int main(int argc, char *argv[])
{
    /* No need for scoped pointer */
    QApplication app(argc, argv);

    /* This object will be watching for QApplication::focusChanged signal
     and report that to console */
    Watcher watcher;
    /* We connect QApplication::focusChanged signal to appropriate Watcher's slot */
    QObject::connect(
        &app, SIGNAL(focusChanged(QWidget*,QWidget*)),
        &watcher, SLOT(onFocusChanged(QWidget*,QWidget*)));

    /* Declarative view, it could be any other widget */
    QDeclarativeView view;
    view.setWindowTitle("Test QML Window");
    view.setSource(QUrl::fromLocalFile("test.qml"));
    view.show();

    return app.exec();
}

そして、main.hこのようになります

#ifndef MAIN_H
#define MAIN_H

#include <QtGui>

class Watcher : public QObject
{
    Q_OBJECT
public:
    Watcher(QObject *parent = 0);

public slots:
    void onFocusChanged(QWidget * old, QWidget * now);
};

#endif // MAIN_H
于 2013-11-09T09:03:28.357 に答える