⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signalsloteditor.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** 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 + -