24.QTableView函數使用,右擊菜單實現


QTableView view(this); QStandardItemModel model(this); /*設置表頭水平標題*/ model.setHorizontalHeaderItem(0,new QStandardItem("Name")); model.setHorizontalHeaderItem(1,new QStandardItem("Sex")); model.setHorizontalHeaderItem(2,new QStandardItem("Age")); model.horizontalHeaderItem(0)->setFont(QFont("Helvetica",20,50));   //設置標題字體

/*設置表頭垂直標題*/ model.setVerticalHeaderItem(0,new QStandardItem("No.1")); model.setVerticalHeaderItem(1,new QStandardItem("No.2")); model.setVerticalHeaderItem(2,new QStandardItem("No.3")); /*設置列表條目數據*/ QPixmap pix(":user.png"); pix = pix.scaled(24,24,Qt::KeepAspectRatio); QStandardItem *itemA=new QStandardItem(); itemA->setData(pix,Qt::DecorationRole);                        //設置條目圖標
itemA->setData("A",Qt::DisplayRole); itemA->setData("A:tooltip",Qt::ToolTipRole); itemA->setData(QFont("宋體",12,QFont::Bold,true),Qt::FontRole); //設置條目字體
itemA->setData(Qt::AlignCenter,Qt::TextAlignmentRole);         //設置條目中心對齊

//可以實現按數值排序,否則的話"2">"123"
itemA->setData(Qt::DisplayRole, 2); 
QLinearGradient linearGradient(0,0,100,20); linearGradient.setColorAt(0.2, Qt::white); linearGradient.setColorAt(0.6, Qt::green); linearGradient.setColorAt(1.0, Qt::black); itemA->setData(QBrush(linearGradient),Qt::BackgroundRole); //設置條目背景色(為漸變色) model.setItem(0,0,itemA); model.setItem(0,1,new QStandardItem("B")); model.setItem(1,0,new QStandardItem("C")); model.item(0,1)->setTextAlignment(Qt::AlignCenter); //設置條目居中對齊
/*將數據模型的第一列進行下降排序(從大到小,不會進行整行排序)*/ model.sort(0,Qt::DescendingOrder);
 

/*根據視圖里的第一列數據,進行整行大小排序*/ 

 view.sortByColumn(0);

 

  /*設置視圖能夠自動使能排序*/

view.setSortingEnabled(true);

 /*設置視圖是否支持自動滑動*/

 view.setAutoScroll(bool enable);

  

 

 /*設置選中一行后,標題的字體不會加粗*/

view->horizontalHeader()->setHighlightSections(false);

 

/*設置列寬不可變動,在5.X后改為了setSectionResizeMode()*/ view.horizontalHeader()->setResizeMode(QHeaderView::Fixed); /*設置行寬不可變動*/ view.verticalHeader()->setResizeMode(QHeaderView::Fixed);

 

/*設置用戶選擇模式, NoSelection表示不能選擇表格*/

 view.setSelectionMode(QAbstractItemView::NoSelection);

 

 /*隱藏垂直標題*/

 view.verticalHeader()->hide();

 

 /*設置用戶選擇時,只能選中一行*/

view.setSelectionMode(QAbstractItemView::SingleSelection);
                       //設置選擇模式,表示只能選中單個

 

 view.setSelectionBehavior(QAbstractItemView::SelectRows);

                      //設置選擇行為,表示只能選擇一行(也可以設置為列,或者單個Item項目)

 

/*設置表格不可編輯*/ view.setEditTriggers(QAbstractItemView::NoEditTriggers);
/*設置表頭的顯示與隱藏*/ view.horizontalHeader()->setVisible(false); view.verticalHeader()->setVisible(false); /*禁止顯示網格線*/ view.setShowGrid(false); /*禁止顯示滾動條*/ view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); /*設置行列的高寬*/ view.setColumnWidth(0,50); //設置column0(第1列)的寬度為50,必須要設置好model后,再來設置寬度   view.setRowHeight(0,30); //設置row0(第1行)的高度為30,必須setModel()后,再來設置高度 view.resizeRowsToContents(); //更據當前內容自動調整行距 view.resizeColumnsToContents(); //更據當前內容自動調整列距

 /*禁止焦點(取消QTableView選中后的虛線框)*/ 

 view.setFocusPolicy(Qt::NoFocus);

 

/*獲取鼠標當前位於視圖的哪個index位置*/

qDebug()<<view.currentIndex().row();  //獲取行號,如果為-1,表示無效

qDebug()<<view.currentIndex().column();//獲取列號,如果為-1,表示無效

 

 

void QTableView::setSpan(int row, int column, int rowSpanCount, int columnSpanCount);

//合並單元格

//第一個參數:要改變的單元格行數
//第二個參數:要改變的單元格列數
//第三個參數:需要合並的行數
//第四個參數:需要合並的列數
//比如: setSpan(0,0,2,3); 表示從table(0,0)開始到2,3結束,合並共2行和3列
 
         

 

 

 

 

合並單元格提醒

數據更新后,還要繼續使用setSpan再次合並(主要是要對全表格進行重新的單元格合並,已經合並過的地方行列又要重新進行新的合並,因為數據已經更新),這時不能直接使用setSpan,而是要先把QTableView的row還原為原來沒有合並行列的情形,再次使用setSpan

 

 

對於QStandardItemsetData()成員 函數的第二個參數role 是模型數據角色 

當role值不同時,則顯示在視圖上的方式也會不同

對於role角色,常用的值有:

  • Qt::DisplayRole      0         以文本方式顯示數據(QString)
  • Qt::DecorationRole       1     將數據作為圖標來裝飾(QIcon,QPixmap)
  • Qt::EditRole      2                可編輯的數據信息顯示(QString)
  • Qt::ToolTipRole      3         作為工具提示顯示(QString)
  • Qt::StatusTipRole   4         作為狀態欄中顯示的數據(QString)
  • Qt::WhatsThisRole 5            作為幫助信息欄中顯示的數據(QString)
  • Qt::FontRole        6              設置字體(QFont)
  • Qt::TextAlignmentRole   7     設置模型數據的文本對齊(Qt::AlignmentFlag)
  • Qt::BackgroundRole      8     設置模型數據的背景色(QBrush)
  • Qt::ForegroundRole      9     設置模型數據的前景色,比如字體(QBrush)

 

實現右擊菜單

當用戶在QTableView視圖里右擊鼠標時,便會觸發一個QEvent::ContextMenu類型的事件,所以通過事件過濾器來實現右擊菜單效果

 

步驟:

  • 定義菜單對象(QMenu)
  • 通過QMenu的addAction()函數,添加子項,並連接到槽函數
  • 定義事件過濾器,判斷是否是QTableView的QEvent::ContextMenu事件
  • 判斷成功,則調用menu.exec(cursor().pos()),在當前鼠標位置打開菜單

 

效果:

 

代碼如下

Widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui>

class Widget : public QWidget
{
    Q_OBJECT

    QTableView  view;
    QStandardItemModel model;
    QMenu   menu;

public:
    explicit Widget(QWidget *parent = 0);
    bool eventFilter(QObject* obj, QEvent *evt);

public slots:
    void onDelete(void);
};

#endif // WIDGET_H

Widget.cpp:

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    view(this),
    model(this),
    menu(this)
{
    model.setItem(0,0, new QStandardItem("A"));
    model.setItem(0,1, new QStandardItem("B"));
    model.setItem(1,0, new QStandardItem("C"));
    model.setItem(1,1, new QStandardItem("D"));
    model.setItem(2,0, new QStandardItem("E"));
    model.setItem(2,1, new QStandardItem("F"));
    model.setItem(3,0, new QStandardItem("G"));
    model.setItem(3,1, new QStandardItem("H"));

    /*設置視圖只能選中一行,取消焦點,禁止編輯*/
    view.setFocusPolicy(Qt::NoFocus);
    view.setEditTriggers(QAbstractItemView::NoEditTriggers);
    view.setSelectionMode(QAbstractItemView::SingleSelection);
    view.setSelectionBehavior(QAbstractItemView::SelectRows);
    view.setModel(&model);

    view.installEventFilter(this);         

    menu.addAction("刪除",this,SLOT(onDelete()));     //設置菜單項,並連接槽函數
}

void Widget::onDelete(void)
{
    model.removeRow(view.currentIndex().row());   //更據當前鼠標所在的索引的行位置,刪除一行
}

bool Widget::eventFilter(QObject* obj, QEvent *evt)
{
    if(obj == &view  &&  evt->type() == QEvent::ContextMenu)
    {
        if(view.currentIndex().isValid()==true)
        {
menu.exec(cursor().pos());
//在當前鼠標位置上運行菜單menu對象 } } return QWidget::eventFilter(obj,evt); }

main函數:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM