6

QScrollArea resizing QWidgetと同じ問題だと思います

しかし、解決策はありません。それでは、問題を公開しましょう。

  • QWidget から継承されたテスト 2:
    • 構成 :
      • QSpinBox のベクトル
      • Qスクロールエリア
      • QVBoxLayout
    • test2 (QWidget) <- QScrollArea <- QVBoxLayout <- スピンボックス
  • 問題 :
    • スクロールバーはありません
    • [修正済み] スクロールバーの内側が縮小されて、何も読めない小さなスペースが表示されます (実行中にウィンドウのサイズを変更すると、内側が大きくなって読みやすくなりますが、スクロールバーは表示されません)

問題は単一のソースから発生していると思います :: サイズのヒントとレイアウト ( http://qt-project.org/doc/qt-5.1/qtwidgets/qscrollarea.html#details )

2 つ目の問題 (縮小されたウィジェット) は、「c->setSizeConstraint(QLayout::SetMinimumSize);」を設定することで解決できます。

現在、欠落しているスクロールバーの解決策を探しています

ここに私の問題を示すコードがあります:

<c++>
#include <QWidget>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QSpinBox>

class test2 : public QWidget
{
        Q_OBJECT
    public:
        test2(QWidget *parent = 0) :QWidget(parent)
        {
            b = new QScrollArea(this);
            c = new QVBoxLayout;

            for (int i = 0; i < 10; i++)
            {
                a.push_back(new QSpinBox());
                c->addWidget(a[i]);
            }

            c->setSizeConstraint(QLayout::SetMinimumSize);
            b->setLayout(c);
            b->resize(200, 200);
        }

        ~test2()
        {
            for (int i = 0; i < 10; i++)
                delete a[i];
        }

    protected:

        QVector<QSpinBox*> a;
        QScrollArea* b;
        QVBoxLayout* c;

};


int main(int argc, char *argv[])
{
    ///*
    QApplication app(argc, argv);

    test2 a;

    a.show();

    return app.exec();//*/
}

編集:: ここで解決策を見つけました: http://qt-project.org/forums/viewthread/295

ここで大量の役に立たないコードを読みたくない場合は、彼がしたこと :: 彼はウィジェット内のレイアウトを歪めました

解決策 :: ScrollBar <- Widget <- Layout からオブジェクトを継承します

ウィジェット <- スクロールバー <- レイアウトの代わりに

しかし、それは回避策であり、実際には解決策ではありません...私が示した例を試してみます。

できます。誰かがより良い解決策を持っていますか??

4

1 に答える 1

10

スクロール領域自体にレイアウトを設定する必要はありません。あなたが引用する答えは、これを誤解していることに由来します。

  1. スクロールエリア内にウィジェットを配置する必要があり、 を使用してそのウィジェットをエリアに渡しますQScrollArea::setWidget。スクロール領域内に子のない 1 つのウィジェットしかない場合は、追加のレイアウトは必要ありません。

  2. レイアウトが所有するウィジェットを手動で追跡する必要はありません。レイアウトを持つウィジェットが削除されると、それらは自動的に削除されます。

  3. QScrollAreaウィジェットは、囲んでいるウィジェット内に配置されていません。

以下は、それを行う方法の実例です。

// https://github.com/KubaO/stackoverflown/tree/master/questions/scroll-18703286
#include <QScrollArea>
#include <QVBoxLayout>
#include <QSpinBox>
#include <QApplication>

class Window : public QWidget
{
   QVBoxLayout m_layout{this};
   QScrollArea m_area;
   QWidget m_contents;
   QVBoxLayout m_contentsLayout{&m_contents};
   QSpinBox m_spinBoxes[10];
public:
   Window(QWidget *parent = {}) : QWidget(parent) {
      m_layout.addWidget(&m_area);
      m_area.setWidget(&m_contents);
      for (auto & spinbox : m_spinBoxes)
         m_contentsLayout.addWidget(&spinbox);
      m_contentsLayout.setSizeConstraint(QLayout::SetMinimumSize);
   }
};

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Window w;
   w.show();
   return app.exec();
}
于 2013-09-09T18:06:20.123 に答える