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