connectioneditorimpl.cpp
来自「qt-x11-free-3.0.3.tar.gz minigui图形界面工具」· C++ 代码 · 共 431 行
CPP
431 行
/************************************************************************ Copyright (C) 2000 Trolltech AS. All rights reserved.**** This file is part of Qt Designer.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "connectioneditorimpl.h"#include "metadatabase.h"#include "formwindow.h"#include "mainwindow.h"#include "command.h"#include "widgetfactory.h"#include "editslotsimpl.h"#include "project.h"#include "pixmapchooser.h"#include <qmetaobject.h>#include <qlistbox.h>#include <qlistview.h>#include <qlabel.h>#include <qpushbutton.h>#include <qregexp.h>#include <qcombobox.h>static const char* const ignore_slots[] = { "destroyed()", "setCaption(const QString&)", "setIcon(const QPixmap&)", "setIconText(const QString&)", "setMouseTracking(bool)", "clearFocus()", "setUpdatesEnabled(bool)", "update()", "update(int,int,int,int)", "update(const QRect&)", "repaint()", "repaint(bool)", "repaint(int,int,int,int,bool)", "repaint(const QRect&,bool)", "repaint(const QRegion&,bool)", "show()", "hide()", "iconify()", "showMinimized()", "showMaximized()", "showFullScreen()", "showNormal()", "polish()", "constPolish()", "raise()", "lower()", "stackUnder(QWidget*)", "move(int,int)", "move(const QPoint&)", "resize(int,int)", "resize(const QSize&)", "setGeometry(int,int,int,int)", "setGeometry(const QRect&)", "focusProxyDestroyed()", "showExtension(bool)", "setUpLayout()", "showDockMenu(const QPoint&)", "init()", "destroy()", "deleteLater()", 0};ConnectionEditor::ConnectionEditor( QWidget *parent, QObject* sndr, QObject* rcvr, FormWindow *fw ) : ConnectionEditorBase( parent, 0, TRUE ), formWindow( fw ){ connect( helpButton, SIGNAL( clicked() ), MainWindow::self, SLOT( showDialogHelp() ) ); if ( rcvr == formWindow ) rcvr = formWindow->mainContainer(); if ( sndr == formWindow ) sndr = formWindow->mainContainer(); sender = sndr; receiver = rcvr; QStrList sigs = sender->metaObject()->signalNames( TRUE ); sigs.remove( "destroyed()" ); sigs.remove( "destroyed(QObject*)" ); sigs.remove( "accessibilityChanged(int)" ); sigs.remove( "accessibilityChanged(int,int)" ); signalBox->insertStrList( sigs ); if ( sender->inherits( "CustomWidget" ) ) { MetaDataBase::CustomWidget *w = ( (CustomWidget*)sender )->customWidget(); for ( QValueList<QCString>::Iterator it = w->lstSignals.begin(); it != w->lstSignals.end(); ++it ) signalBox->insertItem( QString( *it ) ); } if ( sender == fw->mainContainer() ) { QStringList extra = MetaDataBase::signalList( fw ); if ( !extra.isEmpty() ) signalBox->insertStringList( extra ); } labelSignal->setText( tr( "Signals (%1):" ).arg( sender->name() ) ); QPtrDictIterator<QWidget> it( *formWindow->widgets() ); QStringList lst; bool includeMainContainer = TRUE; if ( formWindow->project() ) { LanguageInterface *iface = MetaDataBase::languageInterface( formWindow->project()->language() ); if ( iface && !iface->supports( LanguageInterface::ConnectionsToCustomSlots ) ) includeMainContainer = FALSE; } while ( it.current() ) { if ( lst.find( it.current()->name() ) != lst.end() ) { ++it; continue; } lst << it.current()->name(); if ( it.current()->isVisibleTo( this ) && !it.current()->inherits( "QLayoutWidget" ) && !it.current()->inherits( "Spacer" ) && qstrcmp( it.current()->name(), "central widget" ) != 0 && ( includeMainContainer || !formWindow->isMainContainer( it.current() ) ) ) { if ( !includeMainContainer && formWindow->isMainContainer( receiver ) ) receiver = it.current(); comboReceiver->insertItem( it.current()->name() ); } ++it; } comboReceiver->listBox()->sort(); for ( int i = 0; i < comboReceiver->count(); ++i ) { if ( comboReceiver->text( i ) == QString( receiver->name() ) ) { comboReceiver->setCurrentItem( i ); break; } } signalBox->setCurrentItem( signalBox->firstItem() ); fillConnectionsList(); connectButton->setEnabled( FALSE ); buttonAddSlot->setEnabled( receiver == fw->mainContainer() );}ConnectionEditor::~ConnectionEditor(){}static void insertUnique( const QString &item, QStringList &lst ){ if ( lst.find( item ) == lst.end() ) lst << item;}void ConnectionEditor::signalChanged(){ updateConnectButtonState(); QCString signal = signalBox->currentText().latin1(); if ( !signal.data() ) return; signal = MetaDataBase::normalizeSlot( signal ); slotBox->clear(); if ( signalBox->currentText().isEmpty() ) return; int n = receiver->metaObject()->numSlots( TRUE ); QStringList slts; for( int i = 0; i < n; ++i ) { // accept only public slots. For the form window, also accept protected slots const QMetaData* md = receiver->metaObject()->slot( i, TRUE ); if ( ( (receiver->metaObject()->slot( i, TRUE )->access == QMetaData::Public) || ( formWindow->isMainContainer( (QWidget*)receiver ) && receiver->metaObject()->slot(i, TRUE)->access == QMetaData::Protected) ) && !ignoreSlot( md->name ) && checkConnectArgs( signal.data(), receiver, md->name ) ) insertUnique( md->name, slts ); } LanguageInterface *iface = MetaDataBase::languageInterface( formWindow->project()->language() ); if ( !iface || iface->supports( LanguageInterface::ConnectionsToCustomSlots ) ) { if ( formWindow->isMainContainer( (QWidget*)receiver ) ) { QValueList<MetaDataBase::Slot> moreSlots = MetaDataBase::slotList( formWindow ); if ( !moreSlots.isEmpty() ) { for ( QValueList<MetaDataBase::Slot>::Iterator it = moreSlots.begin(); it != moreSlots.end(); ++it ) { QCString s = (*it).slot; if ( !s.data() ) continue; s = MetaDataBase::normalizeSlot( s ); if ( checkConnectArgs( signal.data(), receiver, s ) ) insertUnique( (*it).slot, slts); } } } } if ( receiver->inherits( "CustomWidget" ) ) { MetaDataBase::CustomWidget *w = ( (CustomWidget*)receiver )->customWidget(); for ( QValueList<MetaDataBase::Slot>::Iterator it = w->lstSlots.begin(); it != w->lstSlots.end(); ++it ) { QCString s = (*it).slot; if ( !s.data() ) continue; s = MetaDataBase::normalizeSlot( s ); if ( checkConnectArgs( signal.data(), receiver, s ) ) insertUnique( (*it).slot, slts ); } } slotBox->insertStringList( slts ); slotsChanged();}bool ConnectionEditor::ignoreSlot( const char* slot ) const{ if ( qstrcmp( slot, "update()" ) == 0 && receiver->inherits( "QDataBrowser" ) ) return FALSE; for ( int i = 0; ignore_slots[i]; i++ ) { if ( qstrcmp( slot, ignore_slots[i] ) == 0 ) return TRUE; } if ( !formWindow->isMainContainer( (QWidget*)receiver ) ) { if ( qstrcmp( slot, "close()" ) == 0 ) return TRUE; } if ( qstrcmp( slot, "setFocus()" ) == 0 ) if ( receiver->isWidgetType() && ( (QWidget*)receiver )->focusPolicy() == QWidget::NoFocus ) return TRUE; return FALSE;}void ConnectionEditor::connectClicked(){ if ( signalBox->currentItem() == -1 || slotBox->currentItem() == -1 ) return; if ( hasConnection( sender->name(), signalBox->currentText(), receiver->name(), slotBox->currentText() ) ) return; MyConnection conn; conn.signal = signalBox->currentText(); conn.slot = slotBox->currentText(); conn.receiver = receiver; QListViewItem *i = new QListViewItem( connectionView ); i->setPixmap( 0, PixmapChooser::loadPixmap( "connecttool.xpm" ) ); i->setText( 0, sender->name() ); i->setText( 1, conn.signal ); i->setText( 2, receiver->name() ); i->setText( 3, conn.slot ); connectionView->setCurrentItem( i ); connectionView->setSelected( i, TRUE ); connections.insert( i, conn ); connectButton->setEnabled( FALSE );}void ConnectionEditor::disconnectClicked(){ QListViewItem *i = connectionView->currentItem(); if ( !i ) return; QMap<QListViewItem*, MyConnection>::Iterator it = connections.find( i ); if ( it != connections.end() ) connections.remove( it ); delete i; if ( connectionView->currentItem() ) connectionView->setSelected( connectionView->currentItem(), TRUE ); connectionsChanged();}void ConnectionEditor::okClicked(){ MacroCommand *rmConn = 0, *addConn = 0; QString n = tr( "Connect/Disconnect the signals and slots of '%1' and '%2'" ).arg( sender->name() ).arg( receiver->name() ); QValueList<MetaDataBase::Connection>::Iterator cit; if ( !oldConnections.isEmpty() ) { QPtrList<Command> commands; for ( cit = oldConnections.begin(); cit != oldConnections.end(); ++cit ) { commands.append( new RemoveConnectionCommand( tr( "Remove connection" ), formWindow, *cit ) ); } rmConn = new MacroCommand( tr( "Remove connections" ), formWindow, commands ); } if ( !connections.isEmpty() ) { QMap<QListViewItem*, MyConnection>::Iterator it = connections.begin(); QPtrList<Command> commands; for ( ; it != connections.end(); ++it ) { MyConnection c = *it; MetaDataBase::Connection conn; conn.sender = sender; conn.signal = c.signal; conn.receiver = c.receiver; conn.slot = c.slot; commands.append( new AddConnectionCommand( tr( "Add connection" ), formWindow, conn ) ); } addConn = new MacroCommand( tr( "Add connections" ), formWindow, commands ); } if ( rmConn || addConn ) { QPtrList<Command> commands; if ( rmConn ) commands.append( rmConn ); if ( addConn ) commands.append( addConn ); MacroCommand *cmd = new MacroCommand( n, formWindow, commands ); formWindow->commandHistory()->addCommand( cmd ); cmd->execute(); } accept();}void ConnectionEditor::cancelClicked(){ reject();}void ConnectionEditor::slotsChanged(){ connectButton->setEnabled( slotBox->currentItem() != -1 ); if ( connectButton->isEnabled() ) updateConnectButtonState();}void ConnectionEditor::connectionsChanged(){ disconnectButton->setEnabled( (connectionView->currentItem() != 0));}void ConnectionEditor::addSlotClicked(){ EditSlots dlg( this, formWindow ); dlg.exec(); signalChanged(); QListViewItemIterator it( connectionView ); QListViewItem *i = 0; while ( ( i = it.current() ) ) { ++it; if ( !MetaDataBase::hasSlot( formWindow, MetaDataBase::normalizeSlot( i->text( 3 ) ).latin1() ) ) delete i; }}void ConnectionEditor::receiverChanged( const QString &s ){ QPtrDictIterator<QWidget> it( *formWindow->widgets() ); while ( it.current() ) { if ( QString( it.current()->name() ) == s ) { receiver = it.current(); break; } ++it; } signalChanged(); buttonAddSlot->setEnabled( receiver == formWindow->mainContainer() ); connectButton->setEnabled( slotBox->currentItem() != -1 ); if ( connectButton->isEnabled() ) updateConnectButtonState(); fillConnectionsList();}void ConnectionEditor::updateConnectButtonState(){ QString snder = sender->name(); QString rcvr = receiver->name(); QString signal = signalBox->currentText(); QString slot = slotBox->currentText(); connectButton->setEnabled( !hasConnection( snder, signal, rcvr, slot ) );}bool ConnectionEditor::hasConnection( const QString &snder, const QString &signal, const QString &rcvr, const QString &slot ){ QListViewItemIterator it( connectionView ); while ( it.current() ) { if ( it.current()->text( 0 ) == snder && it.current()->text( 1 ) == signal && it.current()->text( 2 ) == rcvr && it.current()->text( 3 ) == slot ) { return TRUE; } ++it; } return FALSE;}void ConnectionEditor::fillConnectionsList(){ connectionView->clear(); connections.clear(); oldConnections = MetaDataBase::connections( formWindow, sender, receiver ); if ( !oldConnections.isEmpty() ) { QValueList<MetaDataBase::Connection>::Iterator it = oldConnections.begin(); for ( ; it != oldConnections.end(); ++it ) { if ( formWindow->isMainContainer( (QWidget*)(*it).receiver ) && !MetaDataBase::hasSlot( formWindow, MetaDataBase::normalizeSlot( (*it).slot ).latin1() ) ) continue; MetaDataBase::Connection conn = *it; QListViewItem *i = new QListViewItem( connectionView ); i->setPixmap( 0, PixmapChooser::loadPixmap( "connecttool.xpm" ) ); i->setText( 0, conn.sender->name() ); i->setText( 1, conn.signal ); i->setText( 2, conn.receiver->name() ); i->setText( 3, conn.slot ); MyConnection c; c.signal = conn.signal; c.slot = conn.slot; c.receiver = conn.receiver; connections.insert( i, c ); } } connectionsChanged();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?