ZBLOG

QStyledItemDelegate

QStyledItemDelegate 是 Qt 框架中的一个类,主要用于自定义视图中项的呈现和编辑。它是 QAbstractItemDelegate 的一个子类,提供了一些方便的方法来实现更复杂的项样式和行为。

主要功能

  1. 绘制项:通过重写 paint() 方法,可以控制如何在视图中绘制每个项的外观。这使得你能够定制单元格的样式、字体、颜色等。

  2. 编辑项:通过重写 createEditor()setEditorData() 等方法,可以为模型中的数据创建自定义编辑器。这意味着你可以使用任何适合该数据类型的控件,比如文本框、下拉列表或复选框。

  3. 保存编辑结果:通过重写 setModelData() 方法,可以将用户在编辑器中输入的数据保存回模型。

  4. 调整大小:可以重写 sizeHint() 方法,为每个项提供建议的大小,这对布局非常有帮助。

使用示例

下面是一个简单示例,演示了如何使用 QStyledItemDelegate 自定义表格中的一列,使其显示为带有复选框的列:

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QCheckBox>

class CheckBoxDelegate : public QStyledItemDelegate {
public:
    CheckBoxDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

    // 绘制复选框
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const override {
        bool checked = index.data(Qt::CheckStateRole).toBool();
        QStyleOptionButton checkBoxStyle;
        checkBoxStyle.state = checked ? QStyle::State_On : QStyle::State_Off;
        checkBoxStyle.rect = option.rect;

        QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
    }

    // 创建复选框作为编辑器
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, 
                          const QModelIndex &) const override {
        return new QCheckBox(parent);
    }

    // 将模型数据设置到编辑器
    void setEditorData(QWidget *editor, const QModelIndex &index) const override {
        QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
        if (checkBox)
            checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
    }

    // 从编辑器获取数据并保存到模型
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const override {
        QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
        if (checkBox)
            model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建标准项模型
    QStandardItemModel model(4, 2); // 4行2列
    model.setHorizontalHeaderLabels({"Name", "Active"});

    model.setItem(0, 0, new QStandardItem("Alice"));
    model.setItem(0, 1, new QStandardItem());
    
    model.setItem(1, 0, new QStandardItem("Bob"));
    model.setItem(1, 1, new QStandardItem());
    
    model.setItem(2, 0, new QStandardItem("Charlie"));
    model.setItem(2, 1, new QStandardItem());
    
    model.setItem(3, 0, new QStandardItem("David"));
    model.setItem(3, 1, new QStandardItem());

   // 初始化复选框状态
   for (int i = 0; i < model.rowCount(); ++i) {
       model.item(i)->setData(Qt::Unchecked ,Qt::CheckStateRole); 
   }

   // 创建表格视图并设置模型和委托
   QTableView tableView;
   tableView.setModel(&model);
   
   CheckBoxDelegate *delegate = new CheckBoxDelegate(&tableView);
   tableView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
   
   tableView.setColumnWidth(0 ,100 );
   
   tableView.setColumnWidth(1 ,100 );
   
   tableView.setEditTriggers(QAbstractItemView::DoubleClicked);  
   
   tableView.setColumnHidden(1,true);

   
   
   

   tableView.show();

    
 

  
   

  
    

    

    



    
    
  

 
    
  

  
    
   

  

     
    

  
 

  
 


 
   

  
    
     


  
   
    
    


 
  
 
 
    

  
  
  
   
    
     
    
     

    



    

    
 
  
 

 
  


     
  

    

  


  
 


     
 

     
    
 
     

      
      


    
        

    
    
      
  
    
      

 
     
    





  
  




    
    
    



 
    
        
          
         

     
     

     
    
      
       
       

       
       
       
            
         
         
           
         


         
        
        


        

        
      
     

     
    
    


        

         
        
        
         




          

          
        
        

    
 

 
        
           
           
    
 
    
 
        
         
        


        

         

          
          
  
          

            
             
              
               
               
            
             
              
                
                 

                  

 
                    
                    
                     
                      
   
                       
      
        
                 
                  
                   
                   


                   
                    

  
                    

  
                     
  
                        
                       
                       
                         
                           
                             
 
                              
            
                                      
                                    
                                      
                                     
 
                                     
                
             
        
           
            





    
          
 



         

        
        
     
       

        
         
          
        
          
           
            
             
    
    
 
            
                    
                      
                      
                      
            
                
                 

 
               
    
    
                 
                  
                  
                  [
                 
                   {canvas:..},{chartType:...'line',dataPointType...}
                 
                   ]









                 
                  
                   
                   
    
    
   
     
           
              
              
              
            
               
                [mobile:[...]]
               
               [
                 ...modes:{main:"tvs"..}
                 ...
               ]
                
         
    
    
 
 
    
    
    
 



      

 

 

 
  
 
  
  


     


      




   
 




   

  
    
  

  
  
   
    
  
    
      

    



       
   

 
  




 
    
     
 




 
 
 


 
  
  


  
  
 
  
      



          
        






  
  
 

 

            
           



            








 
 
 
    
  

    

 
    
  


 
    


    

   
    
  
    
  
  
    
    
   
    
 
 
 
  

 


 

  

 
    
 
        
          

  
 
                        

  
                

                
                




                
                </script> 



更新标志位,确保更新完成。                            
                         





最后,需要在窗口关闭后释放相关资源。

小结

通过继承 QStyleditemdelegate ,你可以实现灵活且高度定制化的 UI 元素,在各种情况下提升应用程序用户体验。当需要不同于默认行为时,它特别有用,例如需要复杂控件或特定视觉风格时。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20556

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?