formwindow.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 2,326 行 · 第 1/5 页
CPP
2,326 行
bool FormWindow::handleMousePressEvent(QWidget * widget, QWidget *managedWidget, QMouseEvent *e){ m_startPos = QPoint(); e->accept(); BlockSelection blocker(this); if (core()->formWindowManager()->activeFormWindow() != this) core()->formWindowManager()->setActiveFormWindow(this); if (e->buttons() != Qt::LeftButton) return true; m_startPos = mapFromGlobal(e->globalPos()); const bool inLayout = LayoutInfo::isWidgetLaidout(m_core, managedWidget); const bool selected = isWidgetSelected(managedWidget); if (debugFormWindow) qDebug() << "handleMousePressEvent:" << widget << ',' << managedWidget << " inLayout=" << inLayout << " selected=" << selected; // if the dragged widget is not in a layout, raise it if (inLayout == false) { managedWidget->raise(); if (selected) selectWidget(managedWidget, true); } if (isMainContainer(managedWidget) == true) { // press was on the formwindow clearSelection(false); m_drawRubber = true; m_currRect = QRect(); startRectDraw(mapFromGlobal(e->globalPos()), this, Rubber); return true; } if (e->modifiers() & Qt::ShiftModifier) { // shift-click - toggle selection state of widget selectWidget(managedWidget, !selected); return true; } QWidget *current = managedWidget; if (!selected) clearSelection(false); selectWidget(current); raiseChildSelections(current); return true;}bool FormWindow::isPageOfContainerWidget(const QWidget *widget) const{ QDesignerContainerExtension *c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), widget->parentWidget()); if (c != 0) { for (int i = 0; i<c->count(); ++i) { if (widget == c->widget(i)) return true; } } return false;}bool FormWindow::handleMouseMoveEvent(QWidget *, QWidget *, QMouseEvent *e){ e->accept(); if (e->buttons() != Qt::LeftButton || m_startPos.isNull()) return true; const QPoint pos = mapFromGlobal(e->globalPos()); if (m_drawRubber == true) { continueRectDraw(pos, this, Rubber); return true; } const bool canStartDrag = (m_startPos - pos).manhattanLength() > QApplication::startDragDistance(); if (canStartDrag == false) { // nothing to do return true; } const bool blocked = blockSelectionChanged(true); QWidgetList sel = selectedWidgets(); simplifySelection(&sel); QSet<QWidget*> widget_set; foreach (QWidget *child, sel) { QWidget *current = child; bool done = false; while (!isMainContainer(current) && !done) { if (!isManaged(current)) { current = current->parentWidget(); continue; } else if (LayoutInfo::isWidgetLaidout(core(), current)) { current = current->parentWidget(); continue; } else if (isPageOfContainerWidget(current)) { current = current->parentWidget(); continue; } else if (current->parentWidget()) { QScrollArea *area = qobject_cast<QScrollArea*>(current->parentWidget()->parentWidget()); if (area && area->widget() == current) { current = area; continue; } } done = true; } if (current == mainContainer()) continue; widget_set.insert(current); } sel = widget_set.toList(); QDesignerFormWindowCursorInterface *c = cursor(); QWidget *current = c->current(); if (sel.contains(current)) { sel.removeAll(current); sel.prepend(current); } QList<QDesignerDnDItemInterface*> item_list; const QPoint globalPos = mapToGlobal(m_startPos); const QDesignerDnDItemInterface::DropType dropType = (e->modifiers()#ifndef Q_WS_MAC & Qt::ControlModifier)#else & Qt::AltModifier)#endif ? QDesignerDnDItemInterface::CopyDrop : QDesignerDnDItemInterface::MoveDrop; foreach (QWidget *widget, sel) { item_list.append(new FormWindowDnDItem(dropType, this, widget, globalPos)); if (dropType == QDesignerDnDItemInterface::MoveDrop) widget->hide(); } blockSelectionChanged(blocked); if (sel.count()) core()->formWindowManager()->dragItems(item_list); m_startPos = QPoint(); return true;}bool FormWindow::handleMouseReleaseEvent(QWidget *w, QWidget *mw, QMouseEvent *e){ if (m_dblClicked) { m_dblClicked = false; return true; } if (debugFormWindow) qDebug() << "handleMousePressEvent:" << w << ',' << mw; e->accept(); if (m_drawRubber) { // we were drawing a rubber selection endRectDraw(); // get rid of the rectangle const bool blocked = blockSelectionChanged(true); selectWidgets(); // select widgets which intersect the rect blockSelectionChanged(blocked); m_drawRubber = false; } m_startPos = QPoint(); emitSelectionChanged(); // inform about selection changes return true;}void FormWindow::checkPreviewGeometry(QRect &r){ if (!rect().contains(r)) { if (r.left() < rect().left()) r.moveTopLeft(QPoint(0, r.top())); if (r.right() > rect().right()) r.moveBottomRight(QPoint(rect().right(), r.bottom())); if (r.top() < rect().top()) r.moveTopLeft(QPoint(r.left(), rect().top())); if (r.bottom() > rect().bottom()) r.moveBottomRight(QPoint(r.right(), rect().bottom())); }}void FormWindow::startRectDraw(const QPoint &pos, QWidget *, RectType t){ m_rectAnchor = (t == Insert) ? designerGrid().snapPoint(pos) : pos; m_currRect = QRect(m_rectAnchor, QSize(0, 0)); if (!m_rubberBand) m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this); m_rubberBand->setGeometry(m_currRect); m_rubberBand->show();}void FormWindow::continueRectDraw(const QPoint &pos, QWidget *, RectType t){ const QPoint p2 = (t == Insert) ? designerGrid().snapPoint(pos) : pos; QRect r(m_rectAnchor, p2); r = r.normalized(); if (m_currRect == r) return; if (r.width() > 1 || r.height() > 1) { m_currRect = r; if (m_rubberBand) m_rubberBand->setGeometry(m_currRect); }}void FormWindow::endRectDraw(){ if (m_rubberBand) { delete m_rubberBand; m_rubberBand = 0; }}QWidget *FormWindow::currentWidget() const{ return m_currentWidget;}bool FormWindow::setCurrentWidget(QWidget *currentWidget){ if (debugFormWindow) qDebug() << "setCurrentWidget:" << m_currentWidget << " --> " << currentWidget; if (currentWidget == m_currentWidget) return false; // repaint the old widget unless it is the main window if (m_currentWidget && m_currentWidget != mainContainer()) { m_selection->repaintSelection(m_currentWidget); } // set new and repaint m_currentWidget = currentWidget; if (m_currentWidget && m_currentWidget != mainContainer()) { m_selection->repaintSelection(m_currentWidget); } return true;}QSize FormWindow::sizeHint() const{ QWidget *w = mainContainer(); if (!w) return QSize(400, 300); QWidget *centralWidget = w; QMainWindow *mw = qobject_cast<QMainWindow*>(w); if (mw) centralWidget = mw->centralWidget(); if (centralWidget->layout()) return w->sizeHint(); return w->sizeHint().expandedTo(QSize(400, 300));}void FormWindow::selectWidget(QWidget* w, bool select){ if (trySelectWidget(w, select)) emitSelectionChanged();}// Selects a widget and determines the new current one. Returns true if a change occurs.bool FormWindow::trySelectWidget(QWidget *w, bool select){ if (debugFormWindow) qDebug() << "trySelectWidget:" << w << select; if (!isManaged(w) && !isCentralWidget(w)) return false; if (!select && !isWidgetSelected(w)) return false; if (!mainContainer()) return false; if (isMainContainer(w) || isCentralWidget(w)) { setCurrentWidget(mainContainer()); return true; } if (select) { setCurrentWidget(w); m_selection->addWidget(this, w); } else { QWidget *newCurrent = m_selection->removeWidget(w); if (!newCurrent) newCurrent = mainContainer(); setCurrentWidget(newCurrent); } return true;}void FormWindow::hideSelection(QWidget *w){ selectWidget(w, false);}void FormWindow::clearSelection(bool changePropertyDisplay){ if (debugFormWindow) qDebug() << "clearSelection(" << changePropertyDisplay << ')'; // At all events, we need a current widget. m_selection->clear(); setCurrentWidget(mainContainer()); if (changePropertyDisplay) emitSelectionChanged();}void FormWindow::emitSelectionChanged(){ if (m_blockSelectionChanged == true) { // nothing to do return; } m_selectionChangedTimer->start(0);}void FormWindow::selectionChangedTimerDone(){ emit selectionChanged();}bool FormWindow::isWidgetSelected(QWidget *w) const{ return m_selection->isWidgetSelected(w);}bool FormWindow::isMainContainer(const QWidget *w) const{ return w && (w == this || w == mainContainer());}void FormWindow::updateChildSelections(QWidget *w){ const QWidgetList l = qFindChildren<QWidget*>(w); QListIterator<QWidget*> it(l); while (it.hasNext()) { QWidget *w = it.next(); if (isManaged(w)) { updateSelection(w); } }}void FormWindow::repaintSelection(){ m_selection->repaintSelection();}void FormWindow::raiseSelection(QWidget *w){ m_selection->raiseWidget(w);}void FormWindow::updateSelection(QWidget *w){ if (!w->isVisibleTo(this)) { selectWidget(w, false); } else { m_selection->updateGeometry(w); }}QWidget *FormWindow::designerWidget(QWidget *w) const{ while (w && !isMainContainer(w) && !isManaged(w) || isCentralWidget(w)) w = w->parentWidget(); return w;}bool FormWindow::isCentralWidget(QWidget *w) const{ if (QMainWindow *mainWindow = qobject_cast<QMainWindow*>(mainContainer())) return w == mainWindow->centralWidget(); return false;}void FormWindow::ensureUniqueObjectName(QObject *object){ QString name = object->objectName(); if (name.isEmpty()) { QDesignerWidgetDataBaseInterface *db = core()->widgetDataBase(); if (QDesignerWidgetDataBaseItemInterface *item = db->item(db->indexOfObject(object))) name = QDesignerResource::qtify(item->name()); } unify(object, name, true); object->setObjectName(name);}template <class T, class P>void merge(QList<T> *target, const QList<P> &source){ foreach (P item, source) { target->append(item); }}bool FormWindow::unify(QObject *w, QString &s, bool changeIt){ bool found = !isMainContainer(static_cast<QWidget*>(w)) && objectName() == s; if (!found) { QList<QObject*> objects; if (mainContainer()) { objects.append(mainContainer()); merge(&objects, qFindChildren<QWidget*>(mainContainer())); merge(&objects, qFindChildren<QAction*>(mainContainer())); } QMutableListIterator<QObject*> mit(objects); while (mit.hasNext()) { if (!core()->metaDataBase()->item(mit.next())) { mit.remove(); } } QListIterator<QObject*> it(objects); while (it.hasNext()) { QObject *child = it.next(); if (child != w && child->objectName() == s) { found = true; if (!changeIt) break; qlonglong num = 0; qlonglong factor = 1; int idx = s.length()-1; for ( ; (idx > 0) && s.at(idx).isDigit(); --idx) { num += (s.at(idx).unicode() - QLatin1Char('0').unicode()) * factor; factor *= 10; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?