2017-02-03 12 views
0

2つのQDialogsフォームD1およびD2を作成しました。 D1とD2の距離を一定にするにはどうすればいいですか(私がD1を動かすと、D2も動き、逆も同じです)。2つのQDialogフォームの相対的な位置付け

+0

あなたは[ 'QLayout'](http://doc.qt.io/qt-5/qlayoutを試してみました。 html)またはそれは派生クラスですか? –

+0

ドキュメントによると、QLayoutは、QDialogまたはQForm内のウィジェットの位置を決定するために機能します。私の場合は、2つの独立したQDialogがあるので、QLayoutはそれを行いません。 – Mafura

+0

これらのトップレベルのダイアログはありますか?つまり、それらはアプリケーションウィンドウ/ウィジェットではなく、デスクトップウィンドウの親となりますか? –

答えて

1

私はちょっと退屈になるだろうと思うかもしれませんが、窓のマスクを使用してミニマリストコンテナで両方のダイアログを親にすることです。だから、何かのような...

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(); 

リンク上のコードマスクされた親ウィジェット内のすべての子が、視覚的には区別されて表示されますが、親が移動すると一緒に移動するようにします。

しかし、いくつかの悩みがあります。親のタイトルバーは、デフォルトでは表示されている唯一のものですが、あなたが本当に欲しいと思うのは、親タイトルバーがでない唯一のものです。が表示されます。ウィンドウフラグを設定したり、ウィンドウマネージャを設定することで確実に隠すことができますが、通常は移動やサイズ変更などの処理を行うコードを記述する必要があります。

だから私は...退屈ですしかし、それは確かに動作する可能性があります。

+0

ご返信ありがとうございます。できるだけ早くこれを試してみます。 – Mafura

0

ソースフィルタをインストールして、ソースウィンドウの移動/サイズ変更を監視し、変更をターゲットウィンドウに伝播できます。 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" 
+0

これを行う簡単な方法はないようです。私はこれを試してみる。 – Mafura

関連する問題