diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp
index c0531ebf3797437de085759d17e4d4f8d2b4976f..620facdcd4d017d6faa5f9374f099e3755a734a5 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp
@@ -378,6 +378,33 @@ void CMakeBuildSettingsWidget::updateSelection(const QModelIndex &current, const
         m_editButton->setEnabled(currentModelIndex.flags().testFlag(Qt::ItemIsEditable));
 }
 
+QAction *CMakeBuildSettingsWidget::createForceAction(int type, const QModelIndex &idx)
+{
+    ConfigModel::DataItem::Type t = static_cast<ConfigModel::DataItem::Type>(type);
+    QString typeString;
+    switch (type) {
+    case ConfigModel::DataItem::BOOLEAN:
+        typeString = tr("bool", "display string for cmake type BOOLEAN");
+        break;
+    case ConfigModel::DataItem::FILE:
+        typeString = tr("file", "display string for cmake type FILE");
+        break;
+    case ConfigModel::DataItem::DIRECTORY:
+        typeString = tr("directory", "display string for cmake type DIRECTORY");
+        break;
+    case ConfigModel::DataItem::STRING:
+        typeString = tr("string", "display string for cmake type STRING");
+        break;
+    case ConfigModel::DataItem::UNKNOWN:
+        return nullptr;
+    }
+    QAction *forceAction = new QAction(tr("Force to %1").arg(typeString));
+    forceAction->setEnabled(m_configModel->canForceTo(idx, t));
+    connect(forceAction, &QAction::triggered,
+            this, [this, idx, t]() { m_configModel->forceTo(idx, t); });
+    return forceAction;
+}
+
 bool CMakeBuildSettingsWidget::eventFilter(QObject *target, QEvent *event)
 {
     // handle context menu events:
@@ -392,10 +419,15 @@ bool CMakeBuildSettingsWidget::eventFilter(QObject *target, QEvent *event)
     QMenu *menu = new QMenu(this);
     connect(menu, &QMenu::triggered, menu, &QMenu::deleteLater);
 
-    QAction *forceToStringAction = new QAction(tr("Force to String"), nullptr);
-    forceToStringAction->setEnabled(m_configModel->canForceToString(idx));
-    menu->addAction(forceToStringAction);
-    connect(forceToStringAction, &QAction::triggered, this, [this, idx]() { m_configModel->forceToString(idx); });
+    QAction *action = nullptr;
+    if ((action = createForceAction(ConfigModel::DataItem::BOOLEAN, idx)))
+        menu->addAction(action);
+    if ((action = createForceAction(ConfigModel::DataItem::FILE, idx)))
+        menu->addAction(action);
+    if ((action = createForceAction(ConfigModel::DataItem::DIRECTORY, idx)))
+        menu->addAction(action);
+    if ((action = createForceAction(ConfigModel::DataItem::STRING, idx)))
+        menu->addAction(action);
 
     menu->move(e->globalPos());
     menu->show();
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h
index a15cfe6e0aa6d18c56e514904ee3e2f6e2dacd44..e6e4b1e21c296b47e848ef927549a8eb49a06eca 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.h
@@ -65,6 +65,7 @@ private:
     void updateFromKit();
 
     void updateSelection(const QModelIndex &current, const QModelIndex &previous);
+    QAction *createForceAction(int type, const QModelIndex &idx);
 
     bool eventFilter(QObject *target, QEvent *event);
 
diff --git a/src/plugins/cmakeprojectmanager/configmodel.cpp b/src/plugins/cmakeprojectmanager/configmodel.cpp
index f87ffb967dae54ee4fc02c521d17e4bdeddfe775..ff43d0cc63eb3dd1cd7856dbc6735e6c040bddef 100644
--- a/src/plugins/cmakeprojectmanager/configmodel.cpp
+++ b/src/plugins/cmakeprojectmanager/configmodel.cpp
@@ -135,23 +135,23 @@ bool ConfigModel::hasCMakeChanges() const
     return Utils::contains(m_configuration, [](const InternalDataItem &i) { return i.isCMakeChanged; });
 }
 
-bool ConfigModel::canForceToString(const QModelIndex &idx) const
+bool ConfigModel::canForceTo(const QModelIndex &idx, const ConfigModel::DataItem::Type type) const
 {
     if (idx.model() != const_cast<ConfigModel *>(this) || idx.column() != 1)
         return false;
     Utils::TreeItem *item = itemForIndex(idx);
     auto cmti = dynamic_cast<Internal::ConfigModelTreeItem *>(item);
-    return cmti && (cmti->dataItem->type != DataItem::STRING);
+    return cmti && (cmti->dataItem->type != type);
 }
 
-void ConfigModel::forceToString(const QModelIndex &idx)
+void ConfigModel::forceTo(const QModelIndex &idx, const ConfigModel::DataItem::Type type)
 {
-    QTC_ASSERT(canForceToString(idx), return);
+    QTC_ASSERT(canForceTo(idx, type), return);
     Utils::TreeItem *item = itemForIndex(idx);
     auto cmti = dynamic_cast<Internal::ConfigModelTreeItem *>(item);
 
-    cmti->dataItem->type = DataItem::STRING;
-    const QModelIndex valueIdx = idx.sibling(1, idx.column());
+    cmti->dataItem->type = type;
+    const QModelIndex valueIdx = idx.sibling(idx.row(), 1);
     emit dataChanged(valueIdx, valueIdx);
 }
 
diff --git a/src/plugins/cmakeprojectmanager/configmodel.h b/src/plugins/cmakeprojectmanager/configmodel.h
index adf6edc87e33fc0138c4593639a3f63f2255fafb..626d487ac63342fbff685c13146eeb221831a1c2 100644
--- a/src/plugins/cmakeprojectmanager/configmodel.h
+++ b/src/plugins/cmakeprojectmanager/configmodel.h
@@ -73,8 +73,8 @@ public:
     bool hasChanges() const;
     bool hasCMakeChanges() const;
 
-    bool canForceToString(const QModelIndex &idx) const;
-    void forceToString(const QModelIndex &idx);
+    bool canForceTo(const QModelIndex &idx, const DataItem::Type type) const;
+    void forceTo(const QModelIndex &idx, const DataItem::Type type);
 
     static DataItem dataItemFromIndex(const QModelIndex &idx);