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);
 

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

 view.sortByColumn(0);web

 

  /*設置視圖可以自動使能排序*/ide

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表示不能選擇表格*/ui

 view.setSelectionMode(QAbstractItemView::NoSelection);this

 

 /*隱藏垂直標題*/spa

 view.verticalHeader()->hide();code

 

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

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,表示無效

 

對於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();
}
相關文章
相關標籤/搜索