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

📄 signalsloteditor.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void OldSignalSlotDialog::setSignalSlot(const QString &signal, const QString &slot){    QListWidgetItem *sig_item = findItem(*m_signal_list, signal);    if (sig_item == 0) {        m_show_all_checkbox->setChecked(true);        sig_item = findItem(*m_signal_list, signal);    }    if (sig_item != 0) {        selectSignal(sig_item);        QListWidgetItem *slot_item = findItem(*m_slot_list, slot);        if (slot_item == 0) {            m_show_all_checkbox->setChecked(true);            slot_item = findItem(*m_slot_list, slot);        }        if (slot_item != 0)            selectSlot(slot_item);    }}void OldSignalSlotDialog::selectSignal(QListWidgetItem *item){    if (item == 0) {        m_signal_list->clearSelection();        populateSlotList();        m_slot_list->setEnabled(false);        m_ok_button->setEnabled(false);    } else {        m_signal_list->setItemSelected(item, true);        m_signal_list->scrollToItem(item);        populateSlotList(item->text());        m_slot_list->setEnabled(true);        m_ok_button->setEnabled(!m_slot_list->selectedItems().isEmpty());    }}void OldSignalSlotDialog::selectSlot(QListWidgetItem *item){    if (item == 0) {        m_slot_list->clearSelection();    } else {        m_slot_list->setItemSelected(item, true);        m_slot_list->scrollToItem(item);    }    m_ok_button->setEnabled(true);}QString OldSignalSlotDialog::signal() const{    QList<QListWidgetItem*> item_list = m_signal_list->selectedItems();    if (item_list.size() != 1)        return QString();    return item_list.at(0)->text();}QString OldSignalSlotDialog::slot() const{    QList<QListWidgetItem*> item_list = m_slot_list->selectedItems();    if (item_list.size() != 1)        return QString();    return item_list.at(0)->text();}/********************************************************************************* SignalSlotConnection*/SignalSlotConnection::SignalSlotConnection(ConnectionEdit *edit, QWidget *source, QWidget *target)    : Connection(edit, source, target){}DomConnection *SignalSlotConnection::toUi() const{    DomConnection *result = new DomConnection;    result->setElementSender(sender());    result->setElementSignal(signal());    result->setElementReceiver(receiver());    result->setElementSlot(slot());    DomConnectionHints *hints = new DomConnectionHints;    QList<DomConnectionHint*> list;    QPoint sp = endPointPos(EndPoint::Source);    QPoint tp = endPointPos(EndPoint::Target);    DomConnectionHint *hint = new DomConnectionHint;    hint->setAttributeType(QLatin1String("sourcelabel"));    hint->setElementX(sp.x());    hint->setElementY(sp.y());    list.append(hint);    hint = new DomConnectionHint;    hint->setAttributeType(QLatin1String("destinationlabel"));    hint->setElementX(tp.x());    hint->setElementY(tp.y());    list.append(hint);    hints->setElementHint(list);    result->setElementHints(hints);    return result;}void SignalSlotConnection::setSignal(const QString &signal){    m_signal = signal;    setLabel(EndPoint::Source, m_signal);}void SignalSlotConnection::setSlot(const QString &slot){    m_slot = slot;    setLabel(EndPoint::Target, m_slot);}QString SignalSlotConnection::sender() const{    SignalSlotEditor *edit = qobject_cast<SignalSlotEditor*>(this->edit());    Q_ASSERT(edit != 0);    return realObjectName(edit->formWindow()->core(), object(EndPoint::Source));}QString SignalSlotConnection::receiver() const{    SignalSlotEditor *edit = qobject_cast<SignalSlotEditor*>(this->edit());    Q_ASSERT(edit != 0);    return realObjectName(edit->formWindow()->core(), object(EndPoint::Target));}void SignalSlotConnection::updateVisibility(){    Connection::updateVisibility();    if (isVisible() && (signal().isEmpty() || slot().isEmpty()))        setVisible(false);}/********************************************************************************* Commands*/class SetMemberCommand : public QtCommand, public CETypes{    Q_OBJECTpublic:    SetMemberCommand(SignalSlotConnection *con, EndPoint::Type type,                        const QString &member, SignalSlotEditor *editor);    virtual void redo();    virtual void undo();private:    SignalSlotConnection *m_con;    QString m_old_member, m_new_member;    EndPoint::Type m_type;    SignalSlotEditor *m_editor;};SetMemberCommand::SetMemberCommand(SignalSlotConnection *con, EndPoint::Type type,                                    const QString &member, SignalSlotEditor *editor){    m_con = con;    m_editor = editor;    m_type = type;    m_old_member = type == EndPoint::Source ? con->signal() : con->slot();    m_new_member = member;    setDescription(tr("Change %1").arg(type == EndPoint::Source ? tr("signal") : tr("slot")));}void SetMemberCommand::redo(){    m_con->update();    if (m_type == EndPoint::Source)        m_con->setSignal(m_new_member);    else        m_con->setSlot(m_new_member);    m_con->update();    emit m_editor->connectionChanged(m_con);}void SetMemberCommand::undo(){    m_con->update();    if (m_type == EndPoint::Source)        m_con->setSignal(m_old_member);    else        m_con->setSlot(m_old_member);    m_con->update();    emit m_editor->connectionChanged(m_con);}/********************************************************************************* SignalSlotEditor*/SignalSlotEditor::SignalSlotEditor(QDesignerFormWindowInterface *form_window, QWidget *parent)    : ConnectionEdit(parent, form_window){    m_form_window = form_window;    m_model = new ConnectionModel(this, this);    QDesignerFormEditorInterface *core = form_window->core();    QDesignerMemberSheetFactory *factory = new QDesignerMemberSheetFactory(core->extensionManager());    core->extensionManager()->registerExtensions(factory, Q_TYPEID(QDesignerMemberSheetExtension));    connect(this, SIGNAL(widgetActivated(QWidget*)), form_window, SIGNAL(activated(QWidget*)));}QAbstractItemModel *SignalSlotEditor::model() const{    return m_model;}void SignalSlotEditor::modifyConnection(Connection *con){    SignalSlotConnection *sigslot_con = static_cast<SignalSlotConnection*>(con);    OldSignalSlotDialog *dialog = new OldSignalSlotDialog(m_form_window->core(),                                                    sigslot_con->widget(EndPoint::Source),                                                    sigslot_con->widget(EndPoint::Target));    dialog->setSignalSlot(sigslot_con->signal(), sigslot_con->slot());    if (dialog->exec() == QDialog::Accepted) {        sigslot_con->setSignal(dialog->signal());        sigslot_con->setSlot(dialog->slot());    }}Connection *SignalSlotEditor::createConnection(QWidget *source, QWidget *destination){    SignalSlotConnection *con = 0;    Q_ASSERT(source != 0);    Q_ASSERT(destination != 0);    OldSignalSlotDialog *dialog = new OldSignalSlotDialog(m_form_window->core(), source, destination);    if (dialog->exec() == QDialog::Accepted) {        con = new SignalSlotConnection(this, source, destination);        con->setSignal(dialog->signal());        con->setSlot(dialog->slot());    }    delete dialog;    return con;}DomConnections *SignalSlotEditor::toUi() const{    DomConnections *result = new DomConnections;    QList<DomConnection*> list;    for (int i = 0; i < connectionCount(); ++i) {        SignalSlotConnection *con = static_cast<SignalSlotConnection*>(connection(i));        Q_ASSERT(con != 0);        // If a widget's parent has been removed, and the parent was not a managed widget        // (a page in a tab widget), we never get a widgetRemoved(). So we filter out        // these child widgets here.        QObject *source = con->object(EndPoint::Source);        if (source == 0)            continue;        QObject *target = con->object(EndPoint::Target);        if (target == 0)            continue;        if (QWidget *sourceWidget = qobject_cast<QWidget*>(source)) {            if (!background()->isAncestorOf(sourceWidget))                continue;        }        if (QWidget *targetWidget = qobject_cast<QWidget*>(target)) {            if (!background()->isAncestorOf(targetWidget))                continue;        }        list.append(con->toUi());    }    result->setElementConnection(list);    return result;}QObject *SignalSlotEditor::objectByName(QWidget *topLevel, const QString &name){    Q_ASSERT(topLevel);    if (topLevel->objectName() == name)        return topLevel;    return qFindChild<QObject*>(topLevel, name);}void SignalSlotEditor::fromUi(DomConnections *connections, QWidget *parent){    if (connections == 0)        return;    setBackground(parent);    QList<DomConnection*> list = connections->elementConnection();    foreach (DomConnection *dom_con, list) {        QObject *source = objectByName(parent, dom_con->elementSender());        if (source == 0) {            qWarning("SignalSlotEditor::fromUi(): no source widget called \"%s\"",                        dom_con->elementSender().toUtf8().constData());            continue;        }        QObject *destination = objectByName(parent, dom_con->elementReceiver());        if (destination == 0) {            qWarning("SignalSlotEditor::fromUi(): no destination widget called \"%s\"",                        dom_con->elementReceiver().toUtf8().constData());            continue;        }        QPoint sp = QPoint(20, 20), tp = QPoint(20, 20);        DomConnectionHints *dom_hints = dom_con->elementHints();        if (dom_hints != 0) {            QList<DomConnectionHint*> list = dom_hints->elementHint();            foreach (DomConnectionHint *hint, list) {                QString attr_type = hint->attributeType();                QPoint p = QPoint(hint->elementX(), hint->elementY());                if (attr_type == QLatin1String("sourcelabel"))                    sp = p;                else if (attr_type == QLatin1String("destinationlabel"))                    tp = p;            }        }        SignalSlotConnection *con = new SignalSlotConnection(this);        con->setEndPoint(EndPoint::Source, source, sp);        con->setEndPoint(EndPoint::Target, destination, tp);        con->setSignal(dom_con->elementSignal());        con->setSlot(dom_con->elementSlot());        addConnection(con);    }}static bool skipWidget(QWidget *w){    QString name = QLatin1String(w->metaObject()->className());    if (name == QLatin1String("QDesignerWidget"))        return true;    if (name == QLatin1String("QLayoutWidget"))        return true;    if (name == QLatin1String("qdesigner_internal::FormWindow"))        return true;    if (name == QLatin1String("Spacer"))        return true;    return false;}QWidget *SignalSlotEditor::widgetAt(const QPoint &pos) const{    QWidget *widget = ConnectionEdit::widgetAt(pos);    if (widget == m_form_window->mainContainer())        return widget;    for (; widget != 0; widget = widget->parentWidget()) {        QDesignerMetaDataBaseItemInterface *item = m_form_window->core()->metaDataBase()->item(widget);        if (item == 0)            continue;        if (skipWidget(widget))            continue;        break;    }    return widget;}void SignalSlotEditor::setSignal(SignalSlotConnection *con, const QString &member){    if (member == con->signal())        return;    m_form_window->beginCommand(tr("Change signal"));    undoStack()->push(new SetMemberCommand(con, EndPoint::Source, member, this));    if (!signalMatchesSlot(member, con->slot()))        undoStack()->push(new SetMemberCommand(con, EndPoint::Target, QString(), this));    m_form_window->endCommand();}void SignalSlotEditor::setSlot(SignalSlotConnection *con, const QString &member){    if (member == con->slot())        return;    m_form_window->beginCommand(tr("Change slot"));    undoStack()->push(new SetMemberCommand(con, EndPoint::Target, member, this));    if (!signalMatchesSlot(con->signal(), member))        undoStack()->push(new SetMemberCommand(con, EndPoint::Source, QString(), this));    m_form_window->endCommand();}void SignalSlotEditor::setSource(Connection *_con, const QString &obj_name){    SignalSlotConnection *con = static_cast<SignalSlotConnection*>(_con);    if (con->sender() == obj_name)        return;    m_form_window->beginCommand(tr("Change sender"));    ConnectionEdit::setSource(con, obj_name);    QObject *sourceObject = con->object(EndPoint::Source);    Q_ASSERT(sourceObject != 0);    QStringList member_list = memberList(m_form_window, sourceObject, SignalMember);    if (!member_list.contains(con->signal()))        undoStack()->push(new SetMemberCommand(con, EndPoint::Source, QString(), this));    m_form_window->endCommand();}void SignalSlotEditor::setTarget(Connection *_con, const QString &obj_name){    SignalSlotConnection *con = static_cast<SignalSlotConnection*>(_con);    if (con->receiver() == obj_name)        return;    m_form_window->beginCommand(tr("Change receiver"));    ConnectionEdit::setTarget(con, obj_name);    QWidget *w = con->widget(EndPoint::Target);    QStringList member_list = memberList(m_form_window, w, SlotMember);    if (!member_list.contains(con->slot()))        undoStack()->push(new SetMemberCommand(con, EndPoint::Target, QString(), this));    m_form_window->endCommand();}void SignalSlotEditor::addEmptyConnection(){    SignalSlotConnection *con = new SignalSlotConnection(this);    undoStack()->push(new AddConnectionCommand(this, con));}} // namespace qdesigner_internal#include "signalsloteditor.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -