2016-03-07 477 views
1

我創建了一個QTreeWidget與幾個QTreeWidgetItemQTreeWidgetItem可編輯只允許輸入數字

這裏是我的代碼:

//Defined property tree 
m_pPropertyTree = new QTreeWidget(); 
m_pPropertyTree->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
m_pPropertyTree->setColumnCount(2); 
m_pPropertyTree->setHeaderLabels(QStringList() << "Property" << "Value"); 
//Update to property tree 
//--geometry 
QTreeWidgetItem *pGeometryItem = new QTreeWidgetItem(m_pPropertyTree); 
pGeometryItem->setText(0, "geometry"); 
//X 
QTreeWidgetItem *pXItem = new QTreeWidgetItem(); 
pXItem->setText(0, "X"); 
pXItem->setText(1, QString::number(geometry().x())); 
pXItem->setFlags(pXItem->flags() | Qt::ItemIsEditable); 
pGeometryItem->addChild(pXItem); 
//Y 
QTreeWidgetItem *pYItem = new QTreeWidgetItem(); 
pYItem->setText(0, "Y"); 
pYItem->setText(1, QString::number(geometry().y())); 
pYItem->setFlags(pYItem->flags() | Qt::ItemIsEditable); 
pGeometryItem->addChild(pYItem); 
//Width 
QTreeWidgetItem *pWidthItem = new QTreeWidgetItem(); 
pWidthItem->setText(0, "Width"); 
pWidthItem->setText(1, QString::number(geometry().width())); 
pWidthItem->setFlags(pWidthItem->flags() | Qt::ItemIsEditable); 
pGeometryItem->addChild(pWidthItem); 
//Height 
QTreeWidgetItem *pHeightItem = new QTreeWidgetItem(); 
pHeightItem->setText(0, "Height"); 
pHeightItem->setText(1, QString::number(geometry().height())); 
pHeightItem->setFlags(pHeightItem->flags() | Qt::ItemIsEditable); 
pGeometryItem->addChild(pHeightItem); 

當雙上的項目點擊,我可以編輯該項目的文本。但是,我想只允許用戶在編輯時輸入數字。無論如何要這樣做?

回答

1

我認爲有一些方法,但QItemDelegate::createEditor超載是比其他更有用。

您應該用QValidator編寫代碼,在您的情況下,使用QIntValidator

class CustomDelegate : public QItemDelegate 
{ 
public: 
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem & option, 
         const QModelIndex & index) const 
    { 
     QLineEdit *lineEdit = new QLineEdit(parent); 

     // Set your validator, such as 'only number between 0 ~ 9) 
     QIntValidator *validator = new QIntValidator(0, 9, lineEdit); 
     lineEdit->setValidator(validator); 

     return lineEdit; 
    } 
}; 

然後,將您的自定義委託設置爲您的樹。

m_pPropertyTree->setItemDelegate(new CustomDelegate); 
+0

它的工作,這很好,但我需要問你一些事情。有沒有什麼辦法可以在不創建新類的情況下實現呢?此外,這將適用於整棵樹,如果我想要應用於TreeWidget中的幾個項目,該怎麼辦。 – user2652023

+0

如果你想申請一些項目,重載'createEditor'不是一個正確的方法。您會在[本文中]找到其他方法。(http://stackoverflow.com/questions/14538057/catch-esc-key-press-event-when-editing-a-qtreewidgetitem) – hyun

+0

好的,謝謝我會找到另一種方式。 – user2652023