4

私は構成QDialogに取り組んでいます。ユーザーがクリックすると読み込まれるいくつかのカテゴリ (一般、外観など) があります。各カテゴリには独自のページがあります。これらのページは、それ自体が別個のクラスです (それぞれに独自の ui、cpp、および h があります)。[設定] ウィンドウが読み込まれると、ページがインスタンス化され、QStackedWidget に読み込まれます。Stackedwidget は QScrollArea に配置され、必要に応じてスクロールできるようになります。

ただし、問題があります。QStackedWidget を追加して以来、現在のページが必要ないほど短い場合でも、QScrollArea には常に垂直スクロールバーがあります: (図は最も短いページを示しています)

構成スクロールバーの問題

ScrollArea 垂直スクロール ポリシーは Qt::ScrollBarAsNeeded に設定されているため、論理的には、ページが表示可能領域よりも大きい場合にのみバーを表示する必要があります。

これは私がすでにこれを修正しようとしたものです:

  1. スクロール ポリシーを Qt::ScrollBarAlwaysOff に設定します。これによりスクロールバーが取り除かれますが、長いページをスクロールする必要があることをユーザーに知らせないため、受け入れられません。

  2. QStackedwidget の最小/最大の高さを設定します。これにより、十分に低い値に設定するとスクロールバーが消えますが、ウィジェットの一部が押しつぶされた外観になるため、受け入れられません。

問題が QStackedWidget に関係していることはわかっていますが、QStackedWidget を使用するのはこれが初めてなので、それが何であるかはわかりません。また、スクロールが常に同じ量であることにも気付きました。つまり、スクロール可能な領域は、ページ ウィジェットのサイズに関係なく、常に同じサイズです。なんらかの理由で、最も長いページよりもわずかに大きくなっています。最初は、レイアウトを引き締めるために各ページの下部に配置した垂直スペーサーがこれを引き起こしていると思いましたが、それらを取り除いても修正されませんでした.

更新: Stackedwidget を制御するコードは次のとおりです。

void Newconfig::on_Categories_currentItemChanged(QTreeWidgetItem *current)
{

    QModelIndex index=ui->Categories->currentIndex();
    int idx=index.row();

    QString category=current->text(0);

    this->setWindowTitle("Preferences -- " + category);

    if (stack->currentWidget() != 0) {
        stack->currentWidget()->setSizePolicy(QSizePolicy::Ignored,
                                                    QSizePolicy::Ignored);
    }
    stack->setCurrentIndex(idx);
    stack->currentWidget()->setSizePolicy(QSizePolicy::Expanding,
                                                QSizePolicy::Expanding);
    adjustSize();

}
4

1 に答える 1

5

QStackedWidgetは、それに追加された最大のウィジェットのサイズを取ります。あなたの場合、設定ダイアログの最大のページは、のサイズに影響を与えているものであり、QStackedWidgetしたがって、必要でないと思われる場合でも、スクロール領域にスクロールバーを表示するように強制します。

これを回避するために、現在のウィジェットを変更する直前にトリガーされるスロットを作成できます。このスロットは、QStackedWidget残すページのサイズポリシーと、表示しようQSizePolicy::Ignoredとしているページのサイズポリシーを設定します。そのページの場合-QSizePolicy::Expandingたとえば。この手法の例については、このページで詳しく説明しています。この例には多くのコードが含まれていますが、重要な部分は次のとおりです。

void changeCurrent(int idx)
{
    if (stackWidget->currentWidget() !=0) {
        stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Ignored,
                                                    QSizePolicy::Ignored);
    }
    stackWidget->setCurrentIndex(idx);
    stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Expanding,
                                                QSizePolicy::Expanding);
    adjustSize();
}

この関数は、の現在のインデックスを変更するために呼び出されますQStackedWidget。これにより、表示されたばかりのページには、の全体的なサイズに影響を与えないサイズポリシーが設定されQStackedWidget、表示されようとしているページには、結果のサイズポリシーが設定されます。

于 2012-09-24T03:55:34.813 に答える