| |Home | Tutorial | Classes | Functions | QSA Developer | Language | Library | Qt API | QSA Articles | Qt Script for Applications |
This example shows how to implement a GUI control with a customizable action on activation. ScriptButton is a specialized QPushButton class that can have a snippet of script code attached to it. The script will be executed whenever the user clicks on the button. To modify the behavior of the buttons the user can right-click a button and choose to either rename the button label or edit the script code in a simple editor.
For demonstration purposes the example widget contains both a QLCDNumber and QLineEdit widget whose properties can be changed by the buttons situated on the right side.
Header file:
#ifndef SCRIPTBUTTON_H
#define SCRIPTBUTTON_H
#include <qpushbutton.h>
class QPopupMenu;
class QSInterpreter;
class Editor;
class ScriptButton : public QPushButton {
Q_OBJECT
Q_PROPERTY( QString scriptCode READ scriptCode WRITE setScriptCode )
public:
// standard QPushButton constructors
ScriptButton( QSInterpreter *i, QWidget *parent, const char* name=0 );
ScriptButton( QSInterpreter *i, const QString &text,
QWidget *parent, const char* name=0 );
void setScriptCode( const QString &c );
QString scriptCode() const { return code; }
public slots:
void executeScript();
protected:
void contextMenuEvent( QContextMenuEvent *e );
private slots:
void editCode();
void renameButton();
private:
void init( QSInterpreter *i );
QString code;
QPopupMenu *popup;
Editor *edit;
QSInterpreter *ip;
};
#endif
Implementation:
#include "scriptbutton.h"
#include <qsinterpreter.h>
#include <qseditor.h>
#include <qpopupmenu.h>
#include <qinputdialog.h>
#include <qtextedit.h>
#include <qlayout.h>
class Editor : public QDialog
{
public:
Editor( QSProject *proj, QWidget *parent = 0, const char *name = 0 );
void setCode( const QString &c );
QString code() const { return ed->text(); }
protected:
void keyPressEvent( QKeyEvent *e ) {
if ( e->key() == Key_Escape ) { // let the editor handle the ESC key
e->ignore();
return;
}
QDialog::keyPressEvent( e );
}
private:
QSEditor *ed;
};
Editor::Editor( QSProject *proj, QWidget *parent, const char *name )
: QDialog( parent, name )
{
ed = new QSEditor( proj, this );
QPushButton *ok = new QPushButton( "&OK", this );
QPushButton *cancel = new QPushButton( "&Cancel", this );
connect( ok, SIGNAL( clicked() ), SLOT( accept() ) );
connect( cancel, SIGNAL( clicked() ), SLOT( reject() ) );
QVBoxLayout *vbox = new QVBoxLayout( this, 5 );
vbox->addWidget( ed );
QHBoxLayout *hbox = new QHBoxLayout( vbox );
hbox->addWidget( ok );
hbox->addStretch( -1 );
hbox->addWidget( cancel );
resize( 400, 400 );
}
void Editor::setCode( const QString &c )
{
if ( ed->isActive() )
ed->release();
ed->setText( c );
ed->activate();
}
ScriptButton::ScriptButton( QSInterpreter *i,
QWidget *parent, const char* name )
: QPushButton( parent, name )
{
init( i );
}
ScriptButton::ScriptButton( QSInterpreter *i, const QString &text,
QWidget *parent, const char* name )
: QPushButton( text, parent, name )
{
init( i );
}
void ScriptButton::init( QSInterpreter *i )
{
ip = i;
popup = 0;
edit = 0;
connect( this, SIGNAL(clicked()), this, SLOT(executeScript()) );
}
void ScriptButton::setScriptCode( const QString &c )
{
code = c;
}
void ScriptButton::executeScript()
{
if ( !code.isEmpty() )
ip->evaluate( code );
}
void ScriptButton::contextMenuEvent( QContextMenuEvent *e )
{
if ( !popup ) {
popup = new QPopupMenu( this );
popup->insertItem( "Rename Button", this, SLOT(renameButton()) );
popup->insertItem( "Edit Code", this, SLOT(editCode()) );
}
popup->exec( e->globalPos() );
e->accept();
}
void ScriptButton::renameButton()
{
bool ok;
QString n = QInputDialog::getText( "Script Button",
"Enter new button name",
QLineEdit::Normal,
text(), &ok, this );
if ( ok )
setText( n );
}
void ScriptButton::editCode()
{
if ( !edit ) {
edit = new Editor( ip->project() );
edit->setCaption( QString( "%1 Script Code" ).arg( name() ) );
}
edit->setCode( scriptCode() );
if ( edit->exec() == QDialog::Accepted )
setScriptCode( edit->code() );
}
Main:
#include "scriptbutton.h"
#include <qsinterpreter.h>
#include <qapplication.h>
#include <qwidget.h>
#include <qlcdnumber.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <qgroupbox.h>
#include <qlayout.h>
#include "widgetwrapper.h"
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QWidget widget;
// create two sample widgets
QGroupBox *lcdGroup = new QGroupBox( 2, Qt::Vertical, "lcd", &widget );
QGroupBox *editGroup = new QGroupBox( 2, Qt::Vertical, "edit", &widget );
QLCDNumber *lcd = new QLCDNumber( lcdGroup, "lcd" );
QLineEdit *edit = new QLineEdit( editGroup, "edit" );
edit->setText( "text" );
// some help text
QLabel *help = new QLabel( "Right-click on any of the buttons to edit "
"its properties.", &widget );
new QLabel( "Properties: <ul><li>value</li>"
"<li>setHexMode()</li><li>...</li></ul>", lcdGroup );
new QLabel( "Properties: <ul><li>text</li><li>maxLength</li>"
"<li>clear()</li><li>...</li></ul>", editGroup );
QSInterpreter ip;
// add script buttons
ScriptButton *button1 = new ScriptButton( &ip, "Increase Counter",
&widget, "button1" );
ScriptButton *button2 = new ScriptButton( &ip, "Reset Counter",
&widget, "button2" );
ScriptButton *button3 = new ScriptButton( &ip, "Convert to uppercase",
&widget, "button2" );
ScriptButton *button4 = new ScriptButton( &ip, "&Quit",
&widget, "button3" );
button1->setScriptCode( "Application.lcd.value++;" );
button2->setScriptCode( "Application.lcd.value = 0;" );
button3->setScriptCode( "Application.edit.text = Application.edit.text.upper();" );
button4->setScriptCode( "Application.exit();" );
// layout widgets
QVBoxLayout *ml = new QVBoxLayout( &widget, 10 );
ml->addWidget( help );
QHBoxLayout *hbox = new QHBoxLayout( ml );
hbox->addWidget( lcdGroup );
hbox->addWidget( editGroup );
QVBoxLayout *vbox = new QVBoxLayout( hbox );
vbox->addWidget( button1 );
vbox->addWidget( button2 );
vbox->addWidget( button3 );
vbox->addStretch( -1 );
vbox->addWidget( button4 );
// teach interpreter about widgets
(void)new WidgetWrapperFactory( &ip );
ip.addObject( lcd );
ip.addObject( edit );
app.setMainWidget( &widget );
widget.show();
return app.exec();
}
See also QSA Examples.
| Copyright © 2001-2003 Trolltech | Trademarks | QSA version 1.0.0-beta2
|