12

私はを使用してQTabWidgetおり、現在のタブの変更を実際に発生する前に処理し、特定の条件が満たされた場合はキャンセルする方法が必要です。現在のQTabWidget::currentChangedタブが変更された後に信号が受信されますが、QTabWidget::currentChanging必要な動作を実現するための信号または別の方法はありますか?

4

5 に答える 5

1

ヘッダーで、次のように宣言します。

QWidget *saveTab

シグナルtabChanged用のスロットを持つルーチンを作成します。currentChanged()それで:

void pkgName::tabChanged
//"ask your question"
if "bad reply"
  // This is where you'll "set back to your old tab"
  ui->tabWidget->setCurrentWidget(savedWidget)
end if
savedWidget = ui->tabWidget-> getCurrentWidget() 
// Process
于 2015-09-03T21:00:16.240 に答える
0

前のタブが再選択される前に新しいタブが表示されるため、変更が禁止されている場合に発行された後に通常のQTabWidgetタブを使用して前のタブに戻ると、ユーザーにとって正しく見えません。 「変わろうとしている」。currentChangedQTabWidget

1 つのオプションは、独自の を作成することQTabWidgetです。のおかげでQTabBar、これはかなり明白です。

QTabWidget同様に a のように使用するには like 関数を作成する必要がありますが、必要な関数QTabWidgetはそれほど多くありません。

これは、タブが変更されようとしていることを通知QTabWidgetするシグナルが発行されるクラスの例です。タブの変更を禁止するように設定できます。aboutToChangeTaballowedfalse

#pragma once

#include <QWidget>

class QTabBar;
class QStackedWidget;

class SmartTabWidget : public QWidget
{
    Q_OBJECT

    typedef QWidget baseClass;

public:
    SmartTabWidget( QWidget* parent );

    int addTab(QWidget* page, const QString& label);
    int addTab(QWidget* page, const QIcon& icon, const QString& label);

    int currentIndex() const;
    QWidget* widget( int index );

signals:
    void aboutToChangeTab( QWidget* curTab, QWidget* nextTab, bool* allowed );

private slots:
    void tryToChangeTab( int index );

private:
    QTabBar* m_tab;
    QStackedWidget* m_stack;
};

と:

#include "smart_tab_widget.h"

#include <QTabBar>
#include <QStackedWidget>
#include <QVBoxLayout>
#include <QIcon>

SmartTabWidget::SmartTabWidget( QWidget* widget ) :
    baseClass( widget )
{
    new QVBoxLayout( this );
    layout()->setContentsMargins( 0,0,0,0 );

    layout()->addWidget( m_tab = new QTabBar(this) );
    layout()->addWidget( m_stack = new QStackedWidget(this) );

    connect(m_tab, SIGNAL(currentChanged(int)), this, SLOT(tryToChangeTab(int)));
}

int SmartTabWidget::addTab(QWidget* page, const QString& label)
{
    return addTab( page, QIcon(), label );
}

int SmartTabWidget::addTab(QWidget* page, const QIcon& icon, const QString & label)
{
    m_stack->addWidget( page );

    int index = m_tab->addTab( icon, label );
    assert( m_stack->count() == index+1 );

    return index;
}

int SmartTabWidget::currentIndex() const
{
    return m_tab->currentIndex();
}

QWidget* SmartTabWidget::widget( int index )
{
    return m_stack->widget( index );
}

void SmartTabWidget::tryToChangeTab( int index )
{
    int currentIndex = m_stack->currentIndex();
    bool canChange = true;
    emit aboutToChangeTab( m_stack->widget( currentIndex ),
                           m_stack->widget( index ),
                           &canChange );

    if ( canChange )
    {
        m_stack->setCurrentIndex( index );
    }
    else
    {
        // prevent this function to be called again
        bool blocked = m_tab->blockSignals( true );
        // unselect requested tab as change is not allowed
        m_tab->setCurrentIndex( currentIndex );
        m_tab->blockSignals( blocked );
    }
}

aboutToChangeTabスロット ( ) に接続して、次のallowTabChangeようなことができます。

void MyWidget::allowTabChange( QWidget* curTab, QWidget* nextTab, bool* allowed )
{
    if ( !canChange( curTab, nextTab ) )
        *allowed = false;
}
于 2020-05-15T10:54:15.580 に答える