私はを使用してQTabWidget
おり、現在のタブの変更を実際に発生する前に処理し、特定の条件が満たされた場合はキャンセルする方法が必要です。現在のQTabWidget::currentChanged
タブが変更された後に信号が受信されますが、QTabWidget::currentChanging
必要な動作を実現するための信号または別の方法はありますか?
24162 次
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
タブを使用して前のタブに戻ると、ユーザーにとって正しく見えません。 「変わろうとしている」。currentChanged
QTabWidget
1 つのオプションは、独自の を作成することQTabWidget
です。のおかげでQTabBar
、これはかなり明白です。
QTabWidget
同様に a のように使用するには like 関数を作成する必要がありますが、必要な関数QTabWidget
はそれほど多くありません。
これは、タブが変更されようとしていることを通知QTabWidget
するシグナルが発行されるクラスの例です。タブの変更を禁止するように設定できます。aboutToChangeTab
allowed
false
#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 に答える