28 #define YUILogComponent "qt-wizard"
29 #include <yui/YUILog.h>
32 #include <yui/YShortcut.h>
35 #include <QSvgRenderer>
37 #include <QStackedWidget>
42 #include <qmenudata.h>
45 #include <qpushbutton.h>
47 #include <qtabwidget.h>
48 #include <qtoolbutton.h>
49 #include <QGraphicsDropShadowEffect>
51 #include "QY2ListView.h"
52 #include "QY2Styler.h"
53 #include "QY2HelpDialog.h"
54 #include <QGridLayout>
55 #include <QHeaderView>
61 #include "YQApplication.h"
63 #include "YQAlignment.h"
64 #include "YQReplacePoint.h"
67 #include "YQWizardButton.h"
68 #include "YQWidgetFactory.h"
69 #include "YQSignalBlocker.h"
70 #include <yui/YEvent.h>
71 #include "YQMainWinDock.h"
80 #define TEXTDOMAIN "qt"
82 #define USE_ICON_ON_HELP_BUTTON 0
87 const std::string & backButtonLabel,
88 const std::string & abortButtonLabel,
89 const std::string & nextButtonLabel,
90 YWizardMode wizardMode )
91 : QSplitter( Qt::Horizontal, (QWidget *) parent->widgetRep() )
98 , _backButtonLabel( backButtonLabel )
99 , _abortButtonLabel( abortButtonLabel )
100 , _nextButtonLabel( nextButtonLabel )
103 setObjectName(
"wizard" );
104 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
106 QHBoxLayout* layout =
new QHBoxLayout(
this );
107 layout->setSpacing( 0 );
108 layout->setMargin( 0 );
110 setWidgetRep(
this );
113 _stepsEnabled = ( (wizardMode == YWizardMode_Steps) || main_wizard );
114 _treeEnabled = (wizardMode == YWizardMode_Tree);
116 _stepsRegistered =
false;
118 _direction = YQWizard::Forward;
125 _releaseNotesButton = 0;
137 _sendButtonEvents =
true;
138 _contentsReplacePoint = 0;
140 _previousWindowIcon = topLevelWidget()->windowIcon();
146 if( topLevelWidget()->windowTitle().isEmpty() )
149 QPixmap pixmap ( YUI::app()->applicationIcon().c_str() );
150 if ( !pixmap.isNull() )
151 setWindowIcon ( QIcon ( pixmap ) );
154 layout->addLayout( layoutSideBar(
this ) );
155 layout->addWidget( layoutWorkArea(
this ) );
157 setStretchFactor(indexOf(_sideBar),0);
158 setStretchFactor(indexOf(_workArea),1);
162 if ( !_stepsEnabled )
163 QY2Styler::styler()->registerWidget(
this );
165 if ( !main_wizard && _stepsEnabled )
169 else if ( main_wizard )
181 if (
this == main_wizard )
185 else if ( main_wizard )
188 main_wizard->setSizes( sizes() );
193 QY2Styler::styler()->unregisterWidget(
this );
194 topLevelWidget()->setWindowIcon( _previousWindowIcon );
200 return this != main_wizard;
204 void YQWizard::layoutTitleBar( QWidget * parent )
206 QFrame * titleBar =
new QFrame( parent );
207 YUI_CHECK_NEW( titleBar );
209 QHBoxLayout *layout =
new QHBoxLayout( titleBar );
210 titleBar->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
216 QLabel * left =
new QLabel( titleBar );
217 layout->addWidget( left );
218 left->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
219 left->setObjectName(
"titleBar-left" );
225 layout->addStretch( 10 );
232 QLabel * right =
new QLabel( titleBar );
233 YUI_CHECK_NEW( right );
235 layout->addWidget( right );
236 right->setObjectName(
"titleBar-right" );
240 QLayout *YQWizard::layoutSideBar( QWidget * parent )
242 _sideBar =
new QStackedWidget( parent );
243 YUI_CHECK_NEW( _sideBar );
245 _sideBar->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Preferred ) );
246 _sideBar->setObjectName( QString(
"_sideBar-%1" ).arg(
long(
this ) ) );
247 _sideBar->installEventFilter(
this );
249 QVBoxLayout *vbox =
new QVBoxLayout( );
250 vbox->addWidget( _sideBar );
257 else if ( _stepsEnabled )
269 void YQWizard::layoutStepsPanel()
272 _stepsPanel =
new QFrame( _sideBar );
273 _sideBar->addWidget( _stepsPanel );
274 _stepsPanel->setObjectName(
"steps" );
275 QY2Styler::styler()->registerChildWidget(
this, _stepsPanel );
276 _stepsPanel->setProperty(
"class",
"steps QFrame" );
284 QString qId = fromUTF8(
id );
286 if ( _stepsIDs[ qId ] )
288 yuiError() <<
"Step ID \"" <<
id <<
"\" (\"" << text
289 <<
"\") already used for \"" << _stepsIDs[ qId ]->name() <<
"\""
294 if ( !_stepsList.empty() && _stepsList.last()->name() == fromUTF8( text ) )
302 _stepsList.last()->addID( qId );
310 _stepsIDs.insert( qId, _stepsList.last() );
313 if ( _currentStepID.isNull() )
314 _currentStepID = qId;
330 yuiDebug() <<
"updateSteps" << std::endl;
332 if ( !_stepsRegistered )
333 setUpdatesEnabled(
false);
336 delete _stepsPanel->layout();
337 _stepsPanel->setMaximumWidth( 65000 );
339 QVBoxLayout *_stepsVBox =
new QVBoxLayout( _stepsPanel );
341 QGridLayout *_stepsGrid =
new QGridLayout( );
342 _stepsGrid->setObjectName( QString(
"_stepsGrid_%1" ).arg(
long(
this ) ) );
343 YUI_CHECK_NEW( _stepsGrid );
344 _stepsVBox->addLayout( _stepsGrid );
345 _stepsGrid->setColumnMinimumWidth( 0, 10 );
346 _stepsGrid->setRowStretch( 0, 1 );
347 _stepsGrid->setRowStretch( 1, 1 );
348 _stepsGrid->setRowStretch( 2, 99 );
350 const int statusCol = 1;
351 const int nameCol = 2;
359 for ( QList<Step*>::iterator i = _stepsList.begin(); i != _stepsList.end(); ++i)
363 step->deleteLabels();
365 if ( step->isHeading() )
371 yuiDebug() <<
"Adding StepHeading \"" << step->name() <<
"\"" << std::endl;
372 QLabel * label =
new QLabel( step->name(), _stepsPanel );
373 YUI_CHECK_NEW( label );
374 label->setObjectName( step->name() );
375 label->setAlignment( Qt::AlignLeft | Qt::AlignTop );
376 label->setProperty(
"class",
"steps_heading" );
378 step->setNameLabel( label );
379 _stepsGrid->addWidget( label,
381 1, nameCol - statusCol + 1);
389 yuiDebug() <<
"Adding Step \"" << step->name() <<
"\"" << std::endl;
391 QLabel * statusLabel =
new QLabel( _stepsPanel );
392 YUI_CHECK_NEW( statusLabel );
394 step->setStatusLabel( statusLabel );
395 statusLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
396 _stepsGrid->addWidget( statusLabel, row, statusCol );
402 QLabel * nameLabel =
new QLabel( step->name(), _stepsPanel );
403 YUI_CHECK_NEW( nameLabel );
404 nameLabel->setAlignment( Qt::AlignLeft | Qt::AlignTop );
405 nameLabel->setObjectName( step->name() );
407 step->setNameLabel( nameLabel );
408 _stepsGrid->addWidget( nameLabel, row, nameCol );
415 _stepsVBox->addStretch( 99 );
416 QVBoxLayout *rbl =
new QVBoxLayout();
417 rbl->addWidget( _releaseNotesButton, 0, Qt::AlignCenter );
419 _stepsVBox->addLayout( rbl );
420 _stepsVBox->addStretch( 29 );
424 if ( !_stepsRegistered )
426 QY2Styler::styler()->registerWidget(
this );
427 setUpdatesEnabled(
true );
428 QY2Styler::styler()->updateRendering(
this );
429 _stepsRegistered =
true;
436 yuiDebug() <<
"steps dirty: " << _stepsDirty << std::endl;
442 QList<YQWizard::Step*>::iterator step = _stepsList.begin();
453 while ( step != _stepsList.end() && *step !=
currentStep )
455 ( *step )->setStatus( Step::Done );
461 if ( step != _stepsList.end() )
469 while ( step != _stepsList.end() )
471 ( *step )->setStatus( Step::Todo );
479 yuiDebug() <<
"Setting current step to \"" <<
id <<
"\"" << std::endl;
481 _currentStepID = fromUTF8(
id );
487 QList<Step*> _oldSteps = wizard->
stepsList();
489 if (_oldSteps.empty())
492 foreach(
Step *oldStep, _oldSteps)
496 if( !oldStep->isHeading() )
497 newStep =
new Step( oldStep->name());
501 foreach( QString oneId, oldStep->id())
503 newStep->addID( oneId);
504 _stepsIDs.insert( oneId, newStep );
507 newStep->setEnabled( oldStep->isEnabled());
508 _stepsList.append(newStep);
513 setSizes( main_wizard->sizes());
519 yuiDebug() <<
"Deleting steps" << std::endl;
522 _stepsPanel->setFixedWidth( _stepsPanel->width() );
524 qDeleteAll(_stepsList);
527 _currentStepID = QString::null;
537 return _stepsIDs[ id ];
541 void YQWizard::layoutTreePanel()
543 _treePanel =
new QFrame( _sideBar );
544 YUI_CHECK_NEW( _treePanel );
545 QHBoxLayout *layout =
new QHBoxLayout( _treePanel );
546 _sideBar->addWidget( _treePanel );
548 QVBoxLayout * vbox =
new QVBoxLayout();
549 YUI_CHECK_NEW( vbox );
550 layout->addLayout( vbox );
555 YUI_CHECK_NEW( _tree );
556 vbox->addWidget( _tree );
558 _tree->header()->hide();
559 _tree->header()->setResizeMode( 0, QHeaderView::Stretch );
561 _tree->setRootIsDecorated(
true );
564 connect( _tree, SIGNAL( itemSelectionChanged (
void ) ),
567 connect( _tree, SIGNAL( itemDoubleClicked ( QTreeWidgetItem *,
int ) ),
575 QString qId = fromUTF8(
id );
579 yuiError() <<
"YQWizard widget not created with `opt(`treeEnabled) !" << std::endl;
586 if ( ! parentID.empty() )
594 YUI_CHECK_NEW( item );
599 YUI_CHECK_NEW( item );
602 if ( ! qId.isEmpty() )
603 _treeIDs.insert( qId, item );
623 return _treeIDs[ fromUTF8(
id ) ];
637 _tree->setCurrentItem(item);
638 _tree->scrollToItem(item);
650 if ( item && ! item->id().isEmpty() )
667 QTreeWidgetItem * sel = _tree->currentItem();
673 if ( item && ! item->id().isEmpty() )
674 return toUTF8( item->id() );
678 return std::string();
683 QWidget *YQWizard::layoutWorkArea( QWidget * parent )
685 _workArea =
new QFrame( parent );
686 _workArea->setObjectName(
"work_area" );
688 QY2Styler::styler()->registerChildWidget(
this, _workArea );
690 QVBoxLayout *vbox =
new QVBoxLayout( _workArea );
691 YUI_CHECK_NEW( vbox );
697 _menuBar =
new QMenuBar( _workArea );
698 YUI_CHECK_NEW( _menuBar );
701 vbox->addWidget( _menuBar );
704 QVBoxLayout *innerbox =
new QVBoxLayout( _workArea );
705 YUI_CHECK_NEW( innerbox );
707 innerbox->setMargin ( YQWidgetMargin );
709 vbox->addLayout(innerbox);
710 vbox->setMargin( 0 );
717 QHBoxLayout * headingHBox =
new QHBoxLayout();
718 YUI_CHECK_NEW( headingHBox );
720 innerbox->addLayout( headingHBox );
722 _dialogIcon =
new QLabel( _workArea );
723 YUI_CHECK_NEW( _dialogIcon );
724 headingHBox->addWidget( _dialogIcon );
725 _dialogIcon->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) );
726 _dialogIcon->setObjectName(
"DialogIcon" );
728 _dialogHeading =
new QLabel( _workArea );
729 YUI_CHECK_NEW( _dialogHeading );
730 headingHBox->addWidget( _dialogHeading );
731 _dialogHeading->setAlignment( Qt::AlignLeft );
732 _dialogHeading->setWordWrap(
true );
733 _dialogHeading->setTextFormat( Qt::PlainText );
734 _dialogHeading->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) );
735 _dialogHeading->setObjectName(
"DialogHeading" );
737 _releaseNotesButton =
new QPushButton( _(
"Release Notes..." ), _workArea );
738 YUI_CHECK_NEW( _workArea );
739 headingHBox->addWidget( _releaseNotesButton );
740 _releaseNotesButton->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum ) );
742 connect( _releaseNotesButton, SIGNAL( clicked() ),
745 _releaseNotesButton->hide();
751 layoutClientArea( _workArea );
752 innerbox->addWidget( _clientArea );
758 QLayout *bb = layoutButtonBox( _workArea );
759 innerbox->addLayout( bb );
766 void YQWizard::layoutClientArea( QWidget * parent )
768 _clientArea =
new QFrame( parent );
769 YUI_CHECK_NEW( _clientArea );
770 _clientArea->setObjectName(
"_clientArea");
771 QVBoxLayout *layout =
new QVBoxLayout( _clientArea );
772 layout->setMargin( 0 );
778 _contents =
new YQAlignment(
this, _clientArea, YAlignCenter, YAlignCenter );
779 YUI_CHECK_NEW( _contents );
780 layout->addWidget( _contents );
781 _contents->QObject::setProperty(
"class",
"Contents" );
783 _contents->setStretchable( YD_HORIZ,
true );
784 _contents->setStretchable( YD_VERT,
true );
785 _contents->installEventFilter(
this );
786 _contents->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
792 _contentsReplacePoint = YUI::widgetFactory()->createReplacePoint( _contents );
798 YUI::widgetFactory()->createEmpty( _contentsReplacePoint );
799 _contentsReplacePoint->showChild();
805 QLayout *YQWizard::layoutButtonBox( QWidget * parent )
811 QHBoxLayout * hbox =
new QHBoxLayout();
812 YUI_CHECK_NEW( hbox );
814 hbox->setSpacing( 0 );
815 hbox->setMargin( 0 );
818 _helpButton =
new QPushButton( _(
"Help" ), parent );
819 YUI_CHECK_NEW( _helpButton );
820 _helpButton->setShortcut( Qt::Key_F1 );
822 connect( _helpButton, SIGNAL( clicked() ),
825 hbox->addWidget( _helpButton );
827 hbox->addStretch( 10 );
833 _abortButton =
new YQWizardButton(
this, parent, _abortButtonLabel );
834 YUI_CHECK_NEW( _abortButton );
836 hbox->addWidget( (QWidget *) _abortButton->widgetRep() );
837 connect( _abortButton, SIGNAL( clicked() ),
840 hbox->addSpacing( 10 );
846 _backButton =
new YQWizardButton(
this, parent, _backButtonLabel );
847 YUI_CHECK_NEW( _backButton );
849 hbox->addWidget( (QWidget *) _backButton->widgetRep() );
850 connect( _backButton, SIGNAL( clicked() ),
853 if ( _backButton->
text().isEmpty() )
860 hbox->addSpacing( 5 );
862 _nextButton =
new YQWizardButton(
this, parent, _nextButtonLabel );
863 YUI_CHECK_NEW( _nextButton );
865 hbox->addWidget( (QWidget *) _nextButton->widgetRep() );
866 connect( _nextButton, SIGNAL( clicked() ),
888 if ( QString( signal ).contains(
"nextClicked()" ) )
890 yuiDebug() <<
"nextClicked connected, no longer directly sending button events" << std::endl;
891 _sendButtonEvents =
false;
898 if ( QString( signal ).contains(
"nextClicked()" ) )
900 yuiDebug() <<
"nextClicked disconnected, directly sending button events again" << std::endl;
901 _sendButtonEvents =
true;
910 if ( ! iconName.empty() )
912 QPixmap icon( iconName.c_str() );
915 yuiWarning() <<
"Couldn't load dialog icon \"" << iconName <<
"\"" << std::endl;
918 _dialogIcon->setPixmap( icon );
919 topLevelWidget()->setWindowIcon( icon );
924 _dialogIcon->clear();
925 topLevelWidget()->setWindowIcon( QIcon() );
933 QString title = fromUTF8( titleText.c_str() );
935 if ( !title.isEmpty() )
944 if ( _dialogHeading )
946 if ( ! headingText.empty() )
947 _dialogHeading->setText( fromUTF8( headingText ) );
949 _dialogHeading->clear();
955 if ( _dialogHeading )
957 QString label = _dialogHeading->text();
958 label = label.simplified();
960 if ( ! label.isEmpty() )
961 return toUTF8( label );
964 return "untitled YQWizard";
970 _qHelpText = fromUTF8( helpText );
971 _qHelpText.replace(
"&product;", fromUTF8( YUI::app()->productName() ) );
979 if ( _sendButtonEvents )
982 _direction = YQWizard::Backward;
990 if ( _sendButtonEvents )
999 if ( _sendButtonEvents )
1002 _direction = YQWizard::Forward;
1013 _helpDlg->setHelpText( _qHelpText );
1019 _helpDlg->activateWindow();
1027 if ( ! _releaseNotesButtonId.empty() )
1029 yuiMilestone() <<
"Release Notes button clicked" << std::endl;
1037 if ( _sideBar && _stepsPanel )
1039 _sideBar->setCurrentWidget( _stepsPanel );
1046 if ( _sideBar && _treePanel )
1048 _sideBar->setCurrentWidget( _treePanel );
1054 const std::string &
id )
1058 QMenu * menu =
new QMenu( _menuBar );
1059 YUI_CHECK_NEW( menu );
1061 _menuIDs.insert( fromUTF8(
id ), menu );
1062 _menuBar->addMenu( menu );
1063 menu->setTitle( fromUTF8( text ) );
1065 connect( menu, SIGNAL( triggered ( QAction * ) ),
1074 const std::string & text,
1075 const std::string &
id )
1077 QMenu* parentMenu = _menuIDs[ fromUTF8( parentMenuID ) ];
1081 QMenu * menu =
new QMenu( _menuBar );
1082 YUI_CHECK_NEW( menu );
1084 _menuIDs.insert( fromUTF8(
id ), menu );
1087 connect( menu, SIGNAL( triggered ( QAction * ) ),
1092 yuiError() <<
"Can't find menu with ID " << parentMenuID << std::endl;
1098 const std::string & text,
1099 const std::string & idString )
1101 QMenu * parentMenu = _menuIDs[ fromUTF8( parentMenuID ) ];
1106 int id = _menuEntryIDs.size();
1109 action = parentMenu->addAction( fromUTF8( text ) );
1110 _menuEntryIDs[ action ] = idString ;
1115 yuiError() <<
"Can't find menu with ID " << parentMenuID << std::endl;
1122 QMenu * parentMenu = _menuIDs[ fromUTF8( parentMenuID ) ];
1126 parentMenu->addSeparator();
1130 yuiError() <<
"Can't find menu with ID " << parentMenuID << std::endl;
1142 _menuEntryIDs.clear();
1149 if ( _menuEntryIDs.contains( action ) )
1155 yuiError() <<
"Invalid menu ID " << std::endl;
1168 return sizeHint().width();
1174 return sizeHint().height();
1180 resize( newWidth, newHeight );
1186 QSize contentsRect = _clientArea->contentsRect().size();
1187 _contents->
setSize( contentsRect.width(), contentsRect.height() );
1192 if ( ev->type() == QEvent::Resize && obj == _contents )
1198 if ( ev->type() == QEvent::Resize && obj == _sideBar && main_wizard ==
this && _stepsPanel )
1204 return QWidget::eventFilter( obj, ev );
1210 button->setLabel( newLabel );
1211 YDialog::currentDialog()->checkShortcuts();
1215 if ( wizardButton ) {
1217 if ( newLabel.empty() )
1218 wizardButton->
hide();
1220 wizardButton->
show();
1227 if ( ! _releaseNotesButton )
1229 yuiError() <<
"NULL Release Notes button" << std::endl;
1231 if ( ! _stepsPanel )
1232 yuiError() <<
"This works only if there is a \"steps\" panel!" << std::endl;
1238 _releaseNotesButton->setText( fromUTF8( YShortcut::cleanShortcutString( label ) ) );
1239 _releaseNotesButtonId = id;
1241 _releaseNotesButton->show();
1247 if ( _releaseNotesButton && !_releaseNotesButton->isHidden() )
1248 _releaseNotesButton->hide();
1258 _helpButton->setText( _(
"Help" ) );
1262 _stepsButton->setText( _(
"Steps" ) );
1266 _treeButton->setText( _(
"Tree" ) );
1269 _helpDlg->retranslate();
1274 void YQWizard::Step::deleteLabels()
1276 delete _statusLabel;
1291 if ( !_statusLabel || !_nameLabel || _status == s )
1298 _statusLabel->setProperty(
"class",
"todo-step-status QLabel" );
1299 _nameLabel->setProperty (
"class",
"todo-step-name QLabel" );
1304 _statusLabel->setProperty(
"class",
"done-step-status QLabel" );
1305 _nameLabel->setProperty (
"class",
"done-step-name QLabel" );
1310 _statusLabel->setProperty(
"class",
"current-step-status QLabel" );
1311 _nameLabel->setProperty (
"class",
"current-step-name QLabel" );
1314 _statusLabel->style()->unpolish( _statusLabel );
1315 _statusLabel->style()->polish( _statusLabel );
1316 _nameLabel->style()->unpolish( _nameLabel );
1317 _nameLabel->style()->polish( _nameLabel );
1320 #include "YQWizard.moc"
virtual std::string currentTreeSelection()
virtual void setSortByInsertionSequence(bool sortByInsertionSequence)
virtual void setCurrentStep(const std::string &id)
virtual void setDialogIcon(const std::string &iconName)
void setSideBarWidth(int width)
virtual void deleteTreeItems()
void sendTreeEvent(QTreeWidgetItem *item)
virtual std::string debugLabel() const
virtual void setHelpText(const std::string &helpText)
virtual void setButtonLabel(YPushButton *button, const std::string &newLabel)
void releaseNotesClicked()
virtual void setSize(int newWidth, int newHeight)
void connectNotify(const char *signal)
virtual void deleteSteps()
QString applicationTitle()
virtual void showReleaseNotesButton(const std::string &label, const std::string &id)
virtual bool eventFilter(QObject *obj, QEvent *ev)
virtual void selectTreeItem(const std::string &id)
YQWizard(YWidget *parent, const std::string &backButtonLabel, const std::string &abortButtonLabel, const std::string &nextButtonLabel, YWizardMode wizardMode=YWizardMode_Standard)
void copySteps(YQWizard *wizard)
virtual void addStepHeading(const std::string &text)
void treeSelectionChanged()
virtual void setDialogHeading(const std::string &headingText)
void resizeVisibleChild()
virtual void setDialogTitle(const std::string &titleText)
virtual void addMenuEntry(const std::string &parentMenuID, const std::string &text, const std::string &id)
static YQMainWinDock * mainWinDock()
YQWizard::TreeItem * findTreeItem(const std::string &id)
virtual void hideReleaseNotesButton()
void sendEvent(YEvent *event)
virtual void retranslateInternalButtons()
virtual void addMenuSeparator(const std::string &parentMenuID)
virtual void addStep(const std::string &text, const std::string &id)
virtual void deleteMenus()
virtual void addSubMenu(const std::string &parentMenuID, const std::string &text, const std::string &id)
YQWizard::Step * findStep(const QString &id)
virtual int preferredHeight()
void sendEvent(const std::string &id)
virtual void addMenu(const std::string &text, const std::string &id)
QList< YQWizard::Step * > stepsList()
virtual void addTreeItem(const std::string &parentID, const std::string &text, const std::string &id)
void disconnectNotify(const char *signal)
void sendMenuEvent(QAction *action)
virtual int preferredWidth()
static void setTextdomain(const char *domain)
virtual void setSize(int newWidth, int newHeight)
virtual void updateSteps()