2つのQDialogsフォームD1およびD2を作成しました。 D1とD2の距離を一定にするにはどうすればいいですか(私がD1を動かすと、D2も動き、逆も同じです)。2つのQDialogフォームの相対的な位置付け
答えて
私はちょっと退屈になるだろうと思うかもしれませんが、窓のマスクを使用してミニマリストコンテナで両方のダイアログを親にすることです。だから、何かのような...
class minimalist_container: public QWidget {
using super = QWidget;
public:
explicit minimalist_container (QWidget *parent = nullptr)
: super(parent)
{}
protected:
virtual void resizeEvent (QResizeEvent *event) override
{
/*
* Start with an empty mask.
*/
QRegion mask;
/*
* Now loop though the children and add a region to
* the mask for each child based on its geometry.
*/
for (const auto *obj: children()) {
if (const auto *child = dynamic_cast<const QWidget *>(obj)) {
mask += child->geometry();
}
}
setMask(mask);
super::resizeEvent(event);
}
};
次に、あなたが通常の方法でこれにレイアウトし、子供たちを追加することができますが、親自体が本質的に不可視でなければなりません...
minimalist_container minimalist_container;
auto *minimalist_container_layout = new QHBoxLayout;
minimalist_container_layout->addWidget(new QColorDialog);
minimalist_container_layout->addStretch(1);
minimalist_container_layout->addWidget(new QFontDialog);
minimalist_container.setLayout(minimalist_container_layout);
minimalist_container.show();
リンク上のコードマスクされた親ウィジェット内のすべての子が、視覚的には区別されて表示されますが、親が移動すると一緒に移動するようにします。
しかし、いくつかの悩みがあります。親のタイトルバーは、デフォルトでは表示されている唯一のものですが、あなたが本当に欲しいと思うのは、親タイトルバーがでない唯一のものです。が表示されます。ウィンドウフラグを設定したり、ウィンドウマネージャを設定することで確実に隠すことができますが、通常は移動やサイズ変更などの処理を行うコードを記述する必要があります。
だから私は...退屈ですしかし、それは確かに動作する可能性があります。
ご返信ありがとうございます。できるだけ早くこれを試してみます。 – Mafura
ソースフィルタをインストールして、ソースウィンドウの移動/サイズ変更を監視し、変更をターゲットウィンドウに伝播できます。 OS Xでは、ウインドウが動いている間、ウインドウの移動イベントは送信されないので、非クライアントエリアボタンの押下を監視する必要があります。
私は読者への課題として、反対方向に伝播を残す:)
// https://github.com/KubaO/stackoverflown/tree/master/questions/win-move-track-42019943
#include <QtWidgets>
class WindowOffset : public QObject {
Q_OBJECT
QPoint m_offset, m_ref;
QPointer<QWidget> m_src, m_dst;
void adjust(QEvent * event, const QPoint & delta = QPoint{}) {
qDebug() << "ADJUST" << delta << event;
m_dst->move(m_src->geometry().topRight() + m_offset + delta);
}
protected:
bool eventFilter(QObject *watched, QEvent *event) override {
#ifdef Q_OS_OSX
if (watched == m_src.data()) {
if (event->type() == QEvent::NonClientAreaMouseButtonPress) {
m_ref = QCursor::pos();
qDebug() << "ACQ" << m_ref << event;
}
else if (event->type() == QEvent::NonClientAreaMouseMove &&
static_cast<QMouseEvent*>(event)->buttons() == Qt::LeftButton) {
auto delta = QCursor::pos() - m_ref;
adjust(event, delta);
}
}
#endif
if ((watched == m_src.data() &&
(event->type() == QEvent::Move || event->type() == QEvent::Resize)) ||
(watched == m_dst.data() && event->type() == QEvent::Show)) {
if (event->type() == QEvent::Move)
m_ref = QCursor::pos();
adjust(event);
}
return false;
}
public:
WindowOffset(const QPoint & offset, QObject * parent = nullptr) :
QObject{parent},
m_offset{offset}
{}
WindowOffset(QWidget * src, QWidget * dst, const QPoint & offset, QObject * parent = nullptr) :
WindowOffset{offset, parent}
{
src->installEventFilter(this);
dst->installEventFilter(this);
m_src = src;
m_dst = dst;
}
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QLabel d1{"Source"}, d2{"Target"};
WindowOffset offset{&d1, &d2, {200, 50}};
for (auto d : {&d1, &d2}) {
d->setMinimumSize(300,100);
d->show();
}
return app.exec();
}
#include "main.moc"
これを行う簡単な方法はないようです。私はこれを試してみる。 – Mafura
- 1. 相対的な位置付けのヘルプ
- 2. htmlテーブルの相対的位置付け
- 3. ggplot2でのgeom_textの相対的な位置付けですか?
- 4. Unity2D - プレイヤの相対的なアニメーションの位置付け
- 5. パネルの相対的なマウス位置を見つける
- 6. unity3Dのテキストオブジェクトの相対的位置付け
- 7. 全幅画像の相対的位置付け
- 8. ボタンをクリックしたときの相対的なWPF動的位置付け
- 9. z-インデックスによる相対的位置付け
- 10. CSS Divの相対的な位置
- 11. レスポンスプロファイル画像の隣のFABボタンの相対的な位置付け
- 12. 絶対位置での位置付け
- 13. 第3メニューによる相対的な位置付けの問題
- 14. 相対的な位置本部
- 15. 相対的な位置決めスプライト
- 16. 2つの位置の間の相対的な変換を見つけようとしています - XNA
- 17. フレックスボックスフォーム内の相対ラベルの位置付け
- 18. コンテナ内の絶対的な位置付けがコンテナを相対的にする必要がある理由
- 19. CSSの位置付け:絶対的には固定で相対的な互換性がありますか?
- 20. デスクトップブラウザの固定位置、モバイルデバイスの相対的/静的な位置(Android、iOS ...)
- 21. offsetTopと静的または絶対的な位置付け
- 22. OpenGL - GlVertex相対位置/絶対位置
- 23. CSS:Divの位置:相対的な配置の問題
- 24. CSS - iphoneの絶対的な位置付けですか? (phonegap、jqtouch)
- 25. 絶対的な位置付けの問題
- 26. 2つのビューの間の相対位置のビュー
- 27. 位置のスクロールバーを取り除くこと:位置の絶対的な内部:オーバーフローの相対的な内部:
- 28. Chromeで相対的な絶対位置を外に移動する位置
- 29. 位置の相対的な位置で絶対位置のテキストに罫線を追加
- 30. 自動レイアウトとSnapKitを使用した相対的位置付け
あなたは[ 'QLayout'](http://doc.qt.io/qt-5/qlayoutを試してみました。 html)またはそれは派生クラスですか? –
ドキュメントによると、QLayoutは、QDialogまたはQForm内のウィジェットの位置を決定するために機能します。私の場合は、2つの独立したQDialogがあるので、QLayoutはそれを行いません。 – Mafura
これらのトップレベルのダイアログはありますか?つまり、それらはアプリケーションウィンドウ/ウィジェットではなく、デスクトップウィンドウの親となりますか? –