signalsloteditor.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 925 行 · 第 1/2 页

CPP
925
字号
        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);    }}bool OldSignalSlotDialog::showAllSignalsSlots() const{    return m_show_all_checkbox->isChecked();}void OldSignalSlotDialog::setShowAllSignalsSlots(bool showIt){    m_show_all_checkbox->setChecked(showIt);}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->setCurrentItem(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->setCurrentItem(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();}}namespace qdesigner_internal {/********************************************************************************* 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 QUndoCommand, public CETypes{public:    SetMemberCommand(SignalSlotConnection *con, EndPoint::Type type,                        const QString &member, SignalSlotEditor *editor);    virtual void redo();    virtual void undo();private:    const QString m_old_member;    const QString m_new_member;    const EndPoint::Type m_type;    SignalSlotConnection *m_con;    SignalSlotEditor *m_editor;};SetMemberCommand::SetMemberCommand(SignalSlotConnection *con, EndPoint::Type type,                                   const QString &member, SignalSlotEditor *editor) :    m_old_member(type == EndPoint::Source ? con->signal() : con->slot()),    m_new_member(member),    m_type(type),    m_con(con),    m_editor(editor){    if (type == EndPoint::Source)        setText(QApplication::translate("Command", "Change signal"));    else        setText(QApplication::translate("Command", "Change 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)),     m_showAllSignalsSlots(false){    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(m_form_window->core(),                               sigslot_con->widget(EndPoint::Source),                               sigslot_con->widget(EndPoint::Target),                               m_form_window->core()->topLevel());    dialog.setSignalSlot(sigslot_con->signal(), sigslot_con->slot());    dialog.setShowAllSignalsSlots(m_showAllSignalsSlots);    if (dialog.exec() == QDialog::Accepted) {        sigslot_con->setSignal(dialog.signal());        sigslot_con->setSlot(dialog.slot());    }    m_showAllSignalsSlots = dialog.showAllSignalsSlots();}Connection *SignalSlotEditor::createConnection(QWidget *source, QWidget *destination){    SignalSlotConnection *con = 0;    Q_ASSERT(source != 0);    Q_ASSERT(destination != 0);    OldSignalSlotDialog dialog(m_form_window->core(),                               source,                               destination,                               m_form_window->core()->topLevel());    dialog.setShowAllSignalsSlots(m_showAllSignalsSlots);    if (dialog.exec() == QDialog::Accepted) {        con = new SignalSlotConnection(this, source, destination);        con->setSignal(dialog.signal());        con->setSlot(dialog.slot());    }    m_showAllSignalsSlots = dialog.showAllSignalsSlots();    return con;}DomConnections *SignalSlotEditor::toUi() const{    DomConnections *result = new DomConnections;    QList<DomConnection*> list;    for (int i = 0; i < connectionCount(); ++i) {        const SignalSlotConnection *con = static_cast<const 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.        const QObject *source = con->object(EndPoint::Source);        if (source == 0)            continue;        const QObject *target = con->object(EndPoint::Target);        if (target == 0)            continue;        if (const QWidget *sourceWidget = qobject_cast<const QWidget*>(source)) {            if (!background()->isAncestorOf(sourceWidget))                continue;        }        if (const QWidget *targetWidget = qobject_cast<const QWidget*>(target)) {            if (!background()->isAncestorOf(targetWidget))                continue;        }        list.append(con->toUi());    }    result->setElementConnection(list);    return result;}QObject *SignalSlotEditor::objectByName(QWidget *topLevel, const QString &name) const{    if (name.isEmpty())        return 0;    Q_ASSERT(topLevel);    QObject *object = 0;    if (topLevel->objectName() == name)        object = topLevel;    else        object = qFindChild<QObject*>(topLevel, name);    const QDesignerMetaDataBaseInterface *mdb = formWindow()->core()->metaDataBase();    if (mdb->item(object))        return object;    return 0;}void SignalSlotEditor::fromUi(const DomConnections *connections, QWidget *parent){    if (connections == 0)        return;    setBackground(parent);    clear();    const QList<DomConnection*> list = connections->elementConnection();    foreach (const DomConnection *dom_con, list) {        QObject *source = objectByName(parent, dom_con->elementSender());        if (source == 0) {            qDebug("SignalSlotEditor::fromUi(): no source widget called \"%s\"",                        dom_con->elementSender().toUtf8().constData());            continue;        }        QObject *destination = objectByName(parent, dom_con->elementReceiver());        if (destination == 0) {            qDebug("SignalSlotEditor::fromUi(): no destination widget called \"%s\"",                        dom_con->elementReceiver().toUtf8().constData());            continue;        }        QPoint sp = QPoint(20, 20), tp = QPoint(20, 20);        const 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(const QWidget *w){    const 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(QApplication::translate("Command", "Change signal"));    undoStack()->push(new SetMemberCommand(con, EndPoint::Source, member, this));    if (!signalMatchesSlot(m_form_window->core(), 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(QApplication::translate("Command", "Change slot"));    undoStack()->push(new SetMemberCommand(con, EndPoint::Target, member, this));    if (!signalMatchesSlot(m_form_window->core(), 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(QApplication::translate("Command", "Change sender"));    ConnectionEdit::setSource(con, obj_name);    QObject *sourceObject = con->object(EndPoint::Source);    const 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(QApplication::translate("Command", "Change receiver"));    ConnectionEdit::setTarget(con, obj_name);    QObject *targetObject = con->object(EndPoint::Target);    QStringList member_list = memberList(m_form_window, targetObject, 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 + =
减小字号Ctrl + -
显示快捷键?