📄 signalsloteditor.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <qtundo_p.h>#include "signalsloteditor.h"#include "default_membersheet.h"#include "signalsloteditor_p.h"#include <QtDesigner/QtDesigner>#include <QtGui/QAction>#include <QtGui/QDialog>#include <QtGui/QListWidget>#include <QtGui/QTreeWidget>#include <QtGui/QItemDelegate>#include <QtGui/QItemEditorFactory>#include <QtGui/QHBoxLayout>#include <QtGui/QVBoxLayout>#include <QtGui/QPushButton>#include <QtGui/QLabel>#include <QtGui/QCheckBox>#include <QtGui/QComboBox>#include <QtGui/QStandardItemModel>#include <QtGui/QHeaderView>#include <QtGui/QApplication>#include <QtGui/QMenu>#include <QtCore/qdebug.h>namespace qdesigner_internal {/********************************************************************************* Tools*/template <typename T>static void merge(QDesignerFormWindowInterface *form, QStringList *lst, const QList<T> &elts){ QDesignerMetaDataBaseInterface *db = form->core()->metaDataBase(); foreach (T e, elts) { QAction *action = qobject_cast<QAction*>(e); if (action && db->item(action->menu())) { // good } else if (!db->item(e)) { // hmm, nothing to do continue; } QString name = e->objectName(); if (action && action->menu()) name = action->menu()->objectName(); if (name.isEmpty()) continue; lst->append(name); }}QStringList objectNameList(QDesignerFormWindowInterface *form){ QDesignerFormWindowCursorInterface *cursor = form->cursor(); QStringList result; for (int i = 0; i < cursor->widgetCount(); ++i) { QString name = cursor->widget(i)->objectName().trimmed(); if (!name.isEmpty()) result.append(name); } if (form->mainContainer()) { merge(form, &result, qFindChildren<QAction*>(form->mainContainer())); } result.sort(); return result;}QStringList memberList(QDesignerFormWindowInterface *form, QObject *object, MemberType member_type){ QStringList result; if (object == 0) return result; QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*> (form->core()->extensionManager(), object); Q_ASSERT(members != 0); for (int i = 0; i < members->count(); ++i) { if (!members->isVisible(i)) continue; if (member_type == SignalMember && !members->isSignal(i)) continue; if (member_type == SlotMember && !members->isSlot(i)) continue; result.append(members->signature(i)); } return result;}bool signalMatchesSlot(const QString &signal, const QString &slot){ bool result = true; do { int signal_idx = signal.indexOf(QLatin1Char('(')); int slot_idx = slot.indexOf(QLatin1Char('(')); if (signal_idx == -1 || slot_idx == -1) break; ++signal_idx; ++slot_idx; if (slot.at(slot_idx) == QLatin1Char(')')) break; while (signal_idx < signal.size() && slot_idx < slot.size()) { QChar signal_c = signal.at(signal_idx); QChar slot_c = slot.at(slot_idx); if (signal_c == QLatin1Char(',') && slot_c == QLatin1Char(')')) break; if (signal_c == QLatin1Char(')') && slot_c == QLatin1Char(')')) break; if (signal_c != slot_c) { result = false; break; } ++signal_idx; ++slot_idx; } } while (false); return result;}ClassList classList(const QString &obj_name, MemberType member_type, const QString &peer, QDesignerFormWindowInterface *form){ ClassList result; QObject *object = qFindChild<QObject*>(form, obj_name); if (object == 0) return result; QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*> (form->core()->extensionManager(), object); Q_ASSERT(members != 0); QString class_name; QStringList member_list; for (int i = members->count(); i >= 0; --i) { if (!members->isVisible(i)) continue; if (member_type == SignalMember && !members->isSignal(i)) continue; if (member_type == SlotMember && !members->isSlot(i)) continue; QString signal = member_type == SignalMember ? members->signature(i) : peer; QString slot = member_type == SignalMember ? peer : members->signature(i); if (!signalMatchesSlot(signal, slot)) continue; QString s = members->declaredInClass(i); if (s != class_name) { if (!member_list.isEmpty()) result.append(ClassInfo(class_name, member_list)); class_name = s; member_list.clear(); } member_list.append(members->signature(i)); } if (!member_list.isEmpty()) result.append(ClassInfo(class_name, member_list)); return result;}/********************************************************************************* OldSignalSlotDialog*/class OldSignalSlotDialog : public QDialog{ Q_OBJECTpublic: OldSignalSlotDialog(QDesignerFormEditorInterface *core, QWidget *sender, QWidget *receiver, QWidget *parent = 0); QString signal() const; QString slot() const; void setSignalSlot(const QString &signal, const QString &slot);private slots: void selectSignal(QListWidgetItem *item); void selectSlot(QListWidgetItem *item); void populateSignalList(); void populateSlotList(const QString &signal = QString());private: QListWidget *m_signal_list, *m_slot_list; QPushButton *m_ok_button; QWidget *m_source, *m_destination; QDesignerFormEditorInterface *m_core; QCheckBox *m_show_all_checkbox;};// ### deprecatedstatic QString realObjectName(QDesignerFormEditorInterface *core, QObject *object){ if (object == 0) return QString(); QString object_name = object->objectName(); QDesignerMetaDataBaseInterface *mdb = core->metaDataBase(); QDesignerMetaDataBaseItemInterface *item = mdb->item(object); if (item != 0) object_name = item->name(); return object_name;}static QString realClassName(QDesignerFormEditorInterface *core, QWidget *widget){ QString class_name = QLatin1String(widget->metaObject()->className()); QDesignerWidgetDataBaseInterface *wdb = core->widgetDataBase(); int idx = wdb->indexOfObject(widget); if (idx != -1) class_name = wdb->item(idx)->name(); return class_name;}static QString widgetLabel(QDesignerFormEditorInterface *core, QWidget *widget){ return QString::fromUtf8("%1 (%2)") .arg(realObjectName(core, widget)) .arg(realClassName(core, widget));}void OldSignalSlotDialog::populateSlotList(const QString &signal){ QString selectedName; QList<QListWidgetItem *> list = m_slot_list->selectedItems(); if (list.size() > 0) { QListWidgetItem *item = list.at(0); selectedName = item->text(); } m_slot_list->clear(); bool show_all = m_show_all_checkbox->isChecked(); QStringList signatures; if (QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*> (m_core->extensionManager(), m_destination)) { for (int i=0; i<members->count(); ++i) { if (!members->isVisible(i)) continue; if (!show_all && members->inheritedFromWidget(i)) continue; if (members->isSlot(i)) { if (!signalMatchesSlot(signal, members->signature(i))) continue; signatures.append(members->signature(i)); } } } signatures.sort(); foreach (QString sig, signatures) { QListWidgetItem *item = new QListWidgetItem(m_slot_list); item->setText(sig); if (sig == selectedName) m_slot_list->setItemSelected(item, true); } if (m_slot_list->selectedItems().isEmpty()) m_ok_button->setEnabled(false);}void OldSignalSlotDialog::populateSignalList(){ QString selectedName; QList<QListWidgetItem *> list = m_signal_list->selectedItems(); if (list.size() > 0) { QListWidgetItem *item = list.at(0); selectedName = item->text(); } m_signal_list->clear(); bool show_all = m_show_all_checkbox->isChecked(); QStringList signatures; if (QDesignerMemberSheetExtension *members = qt_extension<QDesignerMemberSheetExtension*>(m_core->extensionManager(), m_source)) { for (int i=0; i<members->count(); ++i) { if (!members->isVisible(i)) continue; if (!show_all && members->inheritedFromWidget(i)) continue; if (members->isSignal(i)) { signatures.append(members->signature(i)); } } } signatures.sort(); bool found_selected = false; foreach (QString sig, signatures) { QListWidgetItem *item = new QListWidgetItem(m_signal_list); item->setText(sig); if (!selectedName.isEmpty() && sig == selectedName) { m_signal_list->setItemSelected(item, true); found_selected = true; } } if (!found_selected) selectedName.clear(); populateSlotList(selectedName); if (!found_selected) { m_slot_list->setEnabled(false); }}// ### use designerOldSignalSlotDialog::OldSignalSlotDialog(QDesignerFormEditorInterface *core, QWidget *source, QWidget *destination, QWidget *parent) : QDialog(parent){ m_source = source; m_destination = destination; m_core = core; m_signal_list = new QListWidget(this); connect(m_signal_list, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(selectSignal(QListWidgetItem*))); m_slot_list = new QListWidget(this); connect(m_slot_list, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(selectSlot(QListWidgetItem*))); m_slot_list->setEnabled(false); m_ok_button = new QPushButton(tr("OK"), this); connect(m_ok_button, SIGNAL(clicked()), this, SLOT(accept())); QPushButton *cancel_button = new QPushButton(tr("Cancel"), this); connect(cancel_button, SIGNAL(clicked()), this, SLOT(reject())); m_ok_button->setEnabled(false); m_show_all_checkbox = new QCheckBox(tr("Show all signals and slots"), this); m_show_all_checkbox->setChecked(false); connect(m_show_all_checkbox, SIGNAL(toggled(bool)), this, SLOT(populateSignalList())); QLabel *source_label = new QLabel(this); source_label->setText(widgetLabel(core, source)); QLabel *destination_label = new QLabel(this); destination_label->setText(widgetLabel(core, destination)); QVBoxLayout *l1 = new QVBoxLayout(this); QHBoxLayout *l2 = new QHBoxLayout(); l1->addLayout(l2); QVBoxLayout *l3 = new QVBoxLayout(); l2->addLayout(l3); l3->addWidget(source_label); l3->addWidget(m_signal_list); QVBoxLayout *l4 = new QVBoxLayout(); l2->addLayout(l4); l4->addWidget(destination_label); l4->addWidget(m_slot_list); QHBoxLayout *l5 = new QHBoxLayout(); l1->addLayout(l5); l5->addWidget(m_show_all_checkbox); l5->addStretch();#ifdef Q_WS_MAC l5->addWidget(cancel_button); l5->addWidget(m_ok_button);#else l5->addWidget(m_ok_button); l5->addWidget(cancel_button);#endif setWindowTitle(tr("Configure Connection")); populateSignalList();}static QListWidgetItem *findItem(const QListWidget &list_widget, const QString &text){ QListWidgetItem *result = 0; for (int i = 0; i < list_widget.count(); ++i) { QListWidgetItem *item = list_widget.item(i); if (item->text() == text) { result = item; break; } } return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -