📄 signalsloteditor.cpp
字号:
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 + -