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 + -
显示快捷键?