qdesigner_promotiondialog.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 422 行 · 第 1/2 页
CPP
422 行
QVBoxLayout *vboxLayout = new QVBoxLayout(this); // tree view group QGroupBox *treeViewGroup = new QGroupBox(); treeViewGroup->setTitle(tr("Promoted Classes")); QVBoxLayout *treeViewVBoxLayout = new QVBoxLayout(treeViewGroup); // tree view m_treeView->setModel (m_model); m_treeView->setMinimumWidth(450); connect(m_treeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(slotSelectionChanged(QItemSelection, QItemSelection))); QHeaderView *headerView = m_treeView->header(); headerView->setResizeMode(QHeaderView::ResizeToContents); treeViewVBoxLayout->addWidget(m_treeView); // remove button QHBoxLayout *hboxLayout = new QHBoxLayout(); hboxLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored)); m_removeButton->setAutoDefault(false); connect(m_removeButton, SIGNAL(clicked()), this, SLOT(slotRemove())); m_removeButton->setEnabled(false); hboxLayout->addWidget(m_removeButton); treeViewVBoxLayout->addLayout(hboxLayout); vboxLayout->addWidget(treeViewGroup); // Create new panel: Try to be smart and preselect a base class. Default to QFrame const QStringList &baseClassNameList = baseClassNames(m_promotion); int preselectedBaseClass = -1; if (m_mode == ModeEditChooseClass) { preselectedBaseClass = baseClassNameList.indexOf(m_promotableWidgetClassName); } if (preselectedBaseClass == -1) preselectedBaseClass = baseClassNameList.indexOf(QLatin1String("QFrame")); NewPromotedClassPanel *newPromotedClassPanel = new NewPromotedClassPanel(baseClassNameList, preselectedBaseClass); connect(newPromotedClassPanel, SIGNAL(newPromotedClass(PromotionParameters, bool *)), this, SLOT(slotNewPromotedClass(PromotionParameters, bool *))); connect(this, SIGNAL(selectedBaseClassChanged(QString)), newPromotedClassPanel, SLOT(chooseBaseClass(QString))); vboxLayout->addWidget(newPromotedClassPanel); // button box vboxLayout->addWidget(m_buttonBox); // connect model connect(m_model, SIGNAL(includeFileChanged(QDesignerWidgetDataBaseItemInterface*, QString)), this, SLOT(slotIncludeFileChanged(QDesignerWidgetDataBaseItemInterface*, QString))); connect(m_model, SIGNAL(classNameChanged(QDesignerWidgetDataBaseItemInterface*, QString)), this, SLOT(slotClassNameChanged(QDesignerWidgetDataBaseItemInterface*, QString))); // focus if (m_mode == ModeEditChooseClass) newPromotedClassPanel->grabFocus(); slotUpdateFromWidgetDatabase(); } QDialogButtonBox *QDesignerPromotionDialog::createButtonBox() { QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Close); connect(buttonBox , SIGNAL(accepted()), this, SLOT(slotAcceptPromoteTo())); buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Promote")); buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); connect(buttonBox , SIGNAL(rejected()), this, SLOT(reject())); return buttonBox; } void QDesignerPromotionDialog::slotUpdateFromWidgetDatabase() { m_model->updateFromWidgetDatabase(); m_treeView->expandAll(); m_removeButton->setEnabled(false); } void QDesignerPromotionDialog::delayedUpdateFromWidgetDatabase() { QTimer::singleShot(0, this, SLOT(slotUpdateFromWidgetDatabase())); } const QStringList &QDesignerPromotionDialog::baseClassNames(const QDesignerPromotionInterface *promotion) { typedef QList<QDesignerWidgetDataBaseItemInterface *> WidgetDataBaseItemList; static QStringList rc; if (rc.empty()) { // Convert the item list into a string list. const WidgetDataBaseItemList dbItems = promotion->promotionBaseClasses(); const WidgetDataBaseItemList::const_iterator cend = dbItems.constEnd(); for (WidgetDataBaseItemList::const_iterator it = dbItems.constBegin() ; it != cend; ++it) { rc.push_back( (*it)->name()); } } return rc; } void QDesignerPromotionDialog::slotAcceptPromoteTo() { Q_ASSERT(m_mode == ModeEditChooseClass); unsigned flags; // Ok pressed: Promote to selected class if (QDesignerWidgetDataBaseItemInterface *dbItem = databaseItemAt(m_treeView->selectionModel()->selection(), flags)) { if (flags & CanPromote) { *m_promoteTo = dbItem ->name(); accept(); } } } void QDesignerPromotionDialog::slotRemove() { unsigned flags; QDesignerWidgetDataBaseItemInterface *dbItem = databaseItemAt(m_treeView->selectionModel()->selection(), flags); if (!dbItem || (flags & Referenced)) return; QString errorMessage; if (m_promotion->removePromotedClass(dbItem->name(), &errorMessage)) { slotUpdateFromWidgetDatabase(); } else { displayError(errorMessage); } } void QDesignerPromotionDialog::slotSelectionChanged(const QItemSelection &selected, const QItemSelection &) { // Enable deleting non-referenced items unsigned flags; const QDesignerWidgetDataBaseItemInterface *dbItem = databaseItemAt(selected, flags); m_removeButton->setEnabled(dbItem && !(flags & Referenced)); // In choose mode, can we promote to the class? if (m_mode == ModeEditChooseClass) { const bool enablePromoted = flags & CanPromote; m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(enablePromoted); m_buttonBox->button(QDialogButtonBox::Ok)->setDefault(enablePromoted); } // different base? if (dbItem) { const QString baseClass = dbItem->extends(); if (baseClass != m_lastSelectedBaseClass) { m_lastSelectedBaseClass = baseClass; emit selectedBaseClassChanged(m_lastSelectedBaseClass); } } } QDesignerWidgetDataBaseItemInterface *QDesignerPromotionDialog::databaseItemAt(const QItemSelection &selected, unsigned &flags) const { flags = 0; const QModelIndexList indexes = selected.indexes(); if (indexes.empty()) return 0; bool referenced; QDesignerWidgetDataBaseItemInterface *dbItem = m_model->databaseItemAt(indexes.front(), &referenced); if (dbItem) { if (referenced) flags |= Referenced; // In choose mode, can we promote to the class? if (m_mode == ModeEditChooseClass && dbItem && dbItem->isPromoted() && dbItem->extends() == m_promotableWidgetClassName) flags |= CanPromote; } return dbItem; } void QDesignerPromotionDialog::slotNewPromotedClass(const PromotionParameters &p, bool *ok) { QString errorMessage; *ok = m_promotion->addPromotedClass(p.m_baseClass, p.m_className, p.m_includeFile, &errorMessage); if (*ok) { // update and select slotUpdateFromWidgetDatabase(); const QModelIndex newClassIndex = m_model->indexOfClass(p.m_className); if (newClassIndex.isValid()) { m_treeView->selectionModel()->select(newClassIndex, QItemSelectionModel::SelectCurrent|QItemSelectionModel::Rows); } } else { displayError(errorMessage); } } void QDesignerPromotionDialog::slotIncludeFileChanged(QDesignerWidgetDataBaseItemInterface *dbItem, const QString &includeFile) { if (includeFile.isEmpty()) { delayedUpdateFromWidgetDatabase(); return; } if (dbItem->includeFile() == includeFile) return; QString errorMessage; if (!m_promotion->setPromotedClassIncludeFile(dbItem->name(), includeFile, &errorMessage)) { displayError(errorMessage); delayedUpdateFromWidgetDatabase(); } } void QDesignerPromotionDialog::slotClassNameChanged(QDesignerWidgetDataBaseItemInterface *dbItem, const QString &newName) { if (newName.isEmpty()) { delayedUpdateFromWidgetDatabase(); return; } const QString oldName = dbItem->name(); if (newName == oldName) return; QString errorMessage; if (!m_promotion->changePromotedClassName(oldName , newName, &errorMessage)) { displayError(errorMessage); delayedUpdateFromWidgetDatabase(); } } void QDesignerPromotionDialog::displayError(const QString &message) { QMessageBox::critical(this, tr("%1 - Error").arg(windowTitle()), message, QMessageBox::Close); }} // namespace qdesigner_internal
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?