QtクリエイターでC++でコーディングしています。画面上にすべてのウィンドウを表示できますが、動きを直接検出したいと思います。ウィンドウから放射される信号によって動きを検出する方法はありますか?ウィンドウ位置を直接検出する方法は?
答えて
ターゲットウィンドウからQWindowを作成し、それをQWidget :: createWindowContainer()を使用してQWidgetにラップすることができます。
あなたはこのQTBUGのスレッドを見て持つことができます。https://bugreports.qt.io/browse/QTBUG-40320
それが適切に動作させるためにいくつかの努力を必要とします。キャプチャされたウィンドウは初期のディメンションを保持せず、ウィンドウを解放すると変な動作をします。最後のQTBUGのコメントを読んで改善を見いだす。
このコードにイベントフィルタを追加して、リアルタイムでウィンドウの位置を取得しました。しかしそれは満足できないかもしれません。
class EventFilter : public QObject
{
Q_OBJECT
public:
EventFilter(){}
virtual ~EventFilter(){}
protected:
bool eventFilter(QObject *obj, QEvent *event);
} ;
bool EventFilter::eventFilter(QObject *obj, QEvent *event)
{
qDebug() << event->type() ;
if (event->type() == QEvent::Move) {
QMoveEvent *moveEvent = static_cast<QMoveEvent *>(event);
qDebug() << "position" << moveEvent->pos() ;
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
QTBUGスニペットからパート3を削除し、内部ウィジェットにイベントハンドラをインストールしました。タイマーを削除することもできます。
// From https://bugreports.qt.io/browse/QTBUG-40320
int main(int argc, char *argv[])
{
// Windows: Find HWND by window title
WId id = (WId)FindWindow(NULL, L"Calculator");
if (!id)
return -1;
QApplication a(argc, argv);
// Optional
QTimer t;
t.start(2500);
// Part 1
QWindow* window = QWindow::fromWinId(id);
window->show();
window->requestActivate();
// Optional
QObject::connect(&t, &QTimer::timeout, [=]
{
qDebug() << "=== Inner QWindow ===";
qDebug() << "Geometry:" << window->geometry();
qDebug() << "Active?:" << window->isActive();
qDebug() << "Flags:" << window->flags();
});
// Part 2
QWidget* widget = QWidget::createWindowContainer(window);
widget->show();
// Optional
QObject::connect(&t, &QTimer::timeout, [=]
{
qDebug() << "=== Outer QWidget ===";
qDebug() << "Geometry:" << widget->geometry();
qDebug() << "Active?" << widget->isActiveWindow();
qDebug() << "Flags:" << widget->windowFlags();
});
// Realtime position
EventFilter filter ;
widget->installEventFilter(&filter) ;
return a.exec();
}
出力:
=== Inner QWindow ===
Geometry: QRect(0,0 640x480)
Active?: true
Flags: QFlags<Qt::WindowType>(ForeignWindow)
=== Outer QWidget ===
Geometry: QRect(2489,29 640x480)
Active? true
Flags: QFlags<Qt::WindowType>(Window|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowCloseButtonHint)
QEvent::Type(Move)
position QPoint(2484,29)
QEvent::Type(Move)
position QPoint(2481,30)
QEvent::Type(Move)
position QPoint(2478,31)
QEvent::Type(Move)
position QPoint(2474,31)
も参照してくださいhttp://blog.qt.io/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/
UIPIの境界を越えて作業できません。そして、別のスレッドが所有するウィンドウに手を差し伸べるには、あなたがやっていること**を正確に知っていて、適切な共用のために両方のスレッドのコードを制御する必要があります。いずれのスレッドでもコードを制御することはできません。この**は壊れます**。 – IInspectable
P.S .: [WinEvents](https://msdn.microsoft.com/en-us/library/windows/desktop/dd373868.aspx)を使用する堅牢なソリューションです。 – IInspectable
- 1. アンドロイドがビーコンの近接位置を検出する方法
- 2. ルーターガードの直接URLナビゲーションを検出する方法は?
- 3. CSSでブラウザのウィンドウ位置を検出する
- 4. 通知領域の位置を検出する方法は?
- 5. PHP XLS 2003(Excel)ファイル - セルの垂直方向の位置を検出する
- 6. 異なるscrollTopの位置を検出する方法
- 7. 検出された顔の位置を特定する方法
- 8. 機能で指の位置を検出する方法
- 9. デフォルト位置検出
- 10. メイトアプレットのウィンドウの原点(位置)を取得する方法は?
- 11. processing3で(P3D)ウィンドウの位置を取得する方法は?
- 12. Win32でウィンドウの位置を監視する方法は?
- 13. 任意のビューの長押し位置の検出方法は?
- 14. Androidのクリック位置を検出する
- 15. アンドロイドアプリケーションで位置が有効かどうかを検出する方法は?
- 16. Tensorflowで画像内のオブジェクトの位置を検出する方法は?
- 17. 角度指示の位置変化を検出する方法は?
- 18. arcgisの情報ウィンドウの位置を変更する方法
- 19. 2次ディスプレイのWPFウィンドウの位置を設定する方法
- 20. ウィンドウのx位置をgxtで取得する方法
- 21. ウィンドウ内のカウンタと位置をリセットする方法
- 22. RichTextBoxの枠線の垂直位置を調整する方法
- 23. React-Nativeで自動位置を検出するマップを作成する方法
- 24. はコードワから直接スクロール位置を取得する方法はありますか?
- 25. MongoDBでキーワードと位置検索を実装する方法は?
- 26. angular ui-router - 状態への直接的なナビゲーションを検出する方法
- 27. 位置スティッキーオーバーフロー・ウィンドウ・ブロック
- 28. PyQt - ウィンドウの位置
- 29. Swift 3で表示されるUITouchの位置を検出する方法
- 30. ウィンドウ内の絶対NSViewフレーム位置を見つける方法
* "画面上のすべてのウィンドウ" * - でも意味することになっていることは何ですか? – IInspectable
ナビゲータのようなすべてのウィンドウ、開かれたアプリケーション、.... – andresouris
[OK]を、その場合、私はあなたに挑戦します* "画面上のすべてのウィンドウを取得する" *。 UIPIは信頼性の低いプロセスが高い完全性を持つリソースにアクセスできるようにするために、納得するほどの痛みを感じています。しかし、とにかく、あなたはあなたのターゲットプラットフォームについて完全に間違った理解を持っています。 Qtは、Qtを知らないウィンドウのためのどんな種類のシグナルも放出しません。 – IInspectable