0

私は qt を初めて使用します。私の最初のアプリはシンプルな UI を設計することです。UI にはビデオ アプリを制御するためのカスタム ウィジェット (ラベルと qsliser とスピン) が必要なので、このようなものを書きます。

class Controls : public QWidget
{


private:

    QHBoxLayout *Layout ;
    string Controlname;
    QLabel *Label ;

    QSpinBox *Spin ;



public:

    QSlider *Slider ;
    Controls(QLayout &Parent , string name , const int &Default_value);
    Controls(const Controls &copy);
    explicit Controls();
    ~Controls(){}


    QLabel * Get_Label() const { return Label ; }
    QSlider *Get_Slider() const { return Slider ; }
    QSpinBox *  Get_Spin()const  { return Spin ; }
    QHBoxLayout *  Get_Layout() {return Layout;}

    void SetValue(const int &newvalue);

    Controls &operator= (const Controls &copy);


};

このウィジェットからオブジェクトを作成するには、次のようにします。

QVBoxLayout layout ;
 Controls *gg   =new Controls (layout ,  "test", 1);
 Controls *gg2   =new Controls (layout ,  "test2", 4);

今、私はこのオブジェクトをqsliderarea内に作成したいので、これを行います

QScrollArea gt ;
 gt.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
 gt.setWidget(gg);
 gt.setWidget(gg2);
 gt.show();

しかし、アプリを実行すると、スライダーエリアが表示されますが、その中にコントロールはありません。私のコードの問題は何ですか

4

2 に答える 2

0

あなたのコードには奇妙なことがたくさんあります。それらconst int &は意味がありません、あなたのコンストラクターはコーディングのQt標準を反映していません。
QWidgetの代入演算子は非常に大きなWTFであり、すべてのQObjectにプライベート代入演算子があるのには理由があります。
この奇妙なことを見ると、コードにはもっと多くの問題があり、QScrollAreaのバグはそれらの問題の現れにすぎないと思います。

スクロール領域で子ウィジェットのサイズを制御する方法は2つあります。ウィジェット自体にレイアウトが設定されているか(これが必要です)、またはsizeHintが適切に実装されています。

于 2013-03-01T10:28:40.797 に答える
0

コントロールを含むレイアウトを含む親ウィジェットが必要です。また、レイアウトを作成するメソッドが戻るとすぐに削除されるため、スタック上にレイアウトを作成しないでください。

これらの線に沿った何か:

// It is not sufficient to set the layout as a parent, you need to add the 
// widgets to the layout. Note that this won't compile unless you change your
// constructor to accept a QLayout* instead of a QLayout&.
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget( new Controls( layout, "test1", 1 );
layout->addWidget( new Controls( layout, "test2", 4 );

// A parent widget 'scrollWidget' is required which contains the layout.
QWidget* scrollWidget = new QWidget( /* maybe assign a parent here
    so you don't have to worry about deletion */ );
scrollWidget->setLayout( layout );

// Your scrollArea can now include that 'scrollWidget' which itself contains 
// everything else.
QScrollArea* scrollArea;
scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
scrollArea->setWidget( scrollWidget );
scrollArea.show();   // Note it is more common to have the scroll area as part of
                     // another widget and show that instead
于 2013-03-01T10:14:00.233 に答える