QTableView 一个单元格中添加按钮
2016-02-23 10:59
411 查看
首先谢谢
http://www.cnblogs.com/li-peng/p/3961843.html http://www.cnblogs.com/li-peng/p/4029885.html http://qimo601.iteye.com/blog/1539147
下面直接上代码:
E:\delcode\TowButtons\TowButtons.pro 在本电脑上面的路径
buttondelegate.h :
#ifndef BUTTONDELEGATE_H
#define BUTTONDELEGATE_H
#include <QItemDelegate>
class ButtonDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit ButtonDelegate(QObject *parent = 0);
void setBtnCnt(int btnCnt) {m_btnCnt=btnCnt;}
void createStyleOptionButton(QVector<QStyleOptionButton *> &vecBtns, QStringList & strtext) const;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRIDE;
signals:
public slots:
private:
void showMsg(QString str);
int m_btnCnt;
private:
typedef QMap<QModelIndex, QPair<QStyleOptionButton*, QStyleOptionButton*>* > collButtons;
// collButtons m_btns;
typedef QMap<QModelIndex, QVector<QStyleOptionButton*> > vecButtons;
vecButtons m_VecBtns;
};
#endif // BUTTONDELEGATE_H
mainwindow.h :
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
};
#endif // MAINWINDOW_H
tablemodel.h:
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QAbstractTableModel>
class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit TableModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE;
void setData(const QVector<QStringList>& data) ;
QVector<QStringList>& DataVector() {return m_data;}
void setHorizontalHeader(const QStringList& headers);
~TableModel(void);
signals:
public slots:
private:
QStringList m_HorizontalHeader;
QVector<QStringList> m_data;
};
#endif // TABLEMODEL_H
tableview.h:
#ifndef TABLEVIEW_H
#define TABLEVIEW_H
#include <QTableView>
#include "tablemodel.h"
#include "buttondelegate.h"
class TableView : public QTableView
{
Q_OBJECT
public:
explicit TableView(QWidget *parent = 0);
TableModel* tableModel() {return m_model;}
~TableView();
signals:
public slots:
private:
void iniData();
private:
TableModel *m_model;
ButtonDelegate *m_buttonDelegate;
};
#endif // TABLEVIEW_H
buttondelegate.cpp:
#include "buttondelegate.h"
#include <QApplication>
#include <QMouseEvent>
#include <QMessageBox>
#include <QPainter>
#include <QStyleOption>
#include <QDesktopWidget>
#include <QDebug>
ButtonDelegate::ButtonDelegate(QObject *parent) :
QItemDelegate(parent)
{
m_btnCnt=3;//! 默认为3个按钮
}
void ButtonDelegate::createStyleOptionButton(QVector<QStyleOptionButton*> & vecBtns, QStringList &strtext) const
{
for(int i=0;i<strtext.count();i++)
{
QStyleOptionButton* pBtn = new QStyleOptionButton();
pBtn->text = strtext[i];
pBtn->state |= QStyle::State_Enabled;
vecBtns.append(pBtn);
}
}
void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QVector<QStyleOptionButton*> vecBtns=m_VecBtns.value(index);
if (0==vecBtns.count()) {
QStringList strtext;
if(m_btnCnt==1)
{
strtext<<tr("XXX");
}
if(m_btnCnt==2)
{
strtext<<tr("XXX")<<tr("YYY");
}
if(m_btnCnt==3)
{
strtext<<tr("XXX")<<tr("YYY")<<tr("ZZZ");
}
createStyleOptionButton(vecBtns, strtext);
(const_cast<ButtonDelegate *>(this))->m_VecBtns.insert(index, vecBtns);
}
int widLen=option.rect.width();
if(m_btnCnt==3)
{
vecBtns[0]->rect = option.rect.adjusted(0, 4, -(widLen*2/3 + 4) , -4);
vecBtns[1]->rect = option.rect.adjusted(widLen/3 + 4, 4, -(widLen/3+4), -4);
vecBtns[2]->rect = option.rect.adjusted(widLen*2/3 + 4 , 4, -4, -4);
}
if(m_btnCnt==2)
{
vecBtns[0]->rect = option.rect.adjusted(4, 4, -(widLen/2 + 4) , -4);
vecBtns[1]->rect = option.rect.adjusted(widLen/2 + 4, 4, -4, -4);
}
if(m_btnCnt==1)
{
vecBtns[0]->rect = option.rect.adjusted(0, 4, -4, -4);
}
painter->save();
if (option.state & QStyle::State_Selected) {
painter->fillRect(option.rect, option.palette.highlight());
}
painter->restore();
QApplication::style()->drawControl(QStyle::CE_PushButton, vecBtns[0], painter);
if(m_btnCnt>=2) QApplication::style()->drawControl(QStyle::CE_PushButton, vecBtns[1], painter);
if(m_btnCnt==3)QApplication::style()->drawControl(QStyle::CE_PushButton, vecBtns[2], painter);
}
bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent* e =(QMouseEvent*)event;
if (m_VecBtns.contains(index)) {
QVector<QStyleOptionButton*> btns = m_VecBtns.value(index);
if (btns[0]->rect.contains(e->x(), e->y())) {
btns[0]->state |= QStyle::State_Sunken;
}
else if(btns[1]->rect.contains(e->x(), e->y())) {
btns[1]->state |= QStyle::State_Sunken;
}
else if(btns[2]->rect.contains(e->x(), e->y())) {
btns[2]->state |= QStyle::State_Sunken;
}
}
}
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent* e =(QMouseEvent*)event;
if (m_VecBtns.contains(index)) {
QVector<QStyleOptionButton*> btns = m_VecBtns.value(index);
if (btns[0]->rect.contains(e->x(), e->y())) {
btns[0]->state &= (~QStyle::State_Sunken);
showMsg(tr("btn1 column %1").arg(index.column()));
} else if(btns[1]->rect.contains(e->x(), e->y())) {
btns[1]->state &= (~QStyle::State_Sunken);
showMsg(tr("btn2 row %1").arg(index.row()));
}
else if(btns[2]->rect.contains(e->x(), e->y())) {
btns[2]->state &= (~QStyle::State_Sunken);
showMsg(tr("btn2 row %1").arg(index.row()));
}
}
}
return true;
}
void ButtonDelegate::showMsg(QString str)
{
QMessageBox msg;
msg.setText(str);
msg.exec();
}
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp:
#include "mainwindow.h"
#include "tableview.h"
#include "tablemodel.h"
#include <QLayout>
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
this->resize(800, 600);
TableView *tv = new TableView(this);
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(tv);
this->setLayout(layout);
}
MainWindow::~MainWindow()
{
}
tablemodel.cpp:
#include "tablemodel.h"
TableModel::TableModel(QObject *parent) :
QAbstractTableModel(parent)
{
}
TableModel::~TableModel()
{
}
int TableModel::rowCount(const QModelIndex &parent) const
{
int i=m_data.size();
return i;
}
int TableModel::columnCount(const QModelIndex &parent) const
{
int j=m_HorizontalHeader.count();
return j;
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole) {
int ncol = index.column();
int nrow = index.row();
QStringList values = m_data.at(nrow);
if (values.size() > ncol)
return values.at(ncol);
else
return QVariant();
}
return QVariant();
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
Qt::ItemFlags flag = QAbstractItemModel::flags(index);
// flag|=Qt::ItemIsEditable // 设置单元格可编辑,此处注释,单元格无法被编辑
return flag;
}
void TableModel::setHorizontalHeader(const QStringList &headers)
{
m_HorizontalHeader = headers;
}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
return m_HorizontalHeader.at(section);
}
return QAbstractTableModel::headerData(section, orientation, role);
}
void TableModel::setData(const QVector<QStringList> &data)
{
m_data = data;
}
tableview.cpp:
#include "tableview.h"
#include "tablemodel.h"
#include "buttondelegate.h"
#include <QHeaderView>
TableView::TableView(QWidget *parent) :
QTableView(parent)
{
iniData();
}
TableView::~TableView()
{
delete m_model;
}
void TableView::iniData()
{
m_model = new TableModel();
this->setModel(m_model);
QStringList headers;
headers << "Id" << "Progress"<< "Progress-test";
m_model->setHorizontalHeader(headers);
QVector<QStringList> data;
data.append(QStringList() << "1" << "01"<< "Progress-test111");
data.append(QStringList() << "2" << "02"<< "Progress-test222");
data.append(QStringList() << "3" << "03"<< "Progress-test333");
data.append(QStringList() << "4" << "04"<< "Progress-test444");
data.append(QStringList() << "5" << "05"<< "Progress-test555");
m_model->setData(data);
m_buttonDelegate = new ButtonDelegate(this);
m_buttonDelegate->setBtnCnt(3);
// this->setItemDelegateForRow(1, m_buttonDelegate);
this->setItemDelegateForColumn(1, m_buttonDelegate);
emit m_model->layoutChanged();
this->setColumnWidth(1, 500);
this->horizontalHeader()->setStretchLastSection(true);
}
下面是QTABLEVIEW的一行中添加RADIO的例子:
下面是代码:
delegate_ItemRbtn_RadioBtn.h:
tablemodel_ItemRbtn_isOut.h:
delegate_ItemRbtn_RadioBtn.cpp:
tablemodel_ItemRbtn_isOut.cpp:
mainwindow.cpp:
main.cpp:
http://www.cnblogs.com/li-peng/p/3961843.html http://www.cnblogs.com/li-peng/p/4029885.html http://qimo601.iteye.com/blog/1539147
下面直接上代码:
E:\delcode\TowButtons\TowButtons.pro 在本电脑上面的路径
buttondelegate.h :
#ifndef BUTTONDELEGATE_H
#define BUTTONDELEGATE_H
#include <QItemDelegate>
class ButtonDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit ButtonDelegate(QObject *parent = 0);
void setBtnCnt(int btnCnt) {m_btnCnt=btnCnt;}
void createStyleOptionButton(QVector<QStyleOptionButton *> &vecBtns, QStringList & strtext) const;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRIDE;
signals:
public slots:
private:
void showMsg(QString str);
int m_btnCnt;
private:
typedef QMap<QModelIndex, QPair<QStyleOptionButton*, QStyleOptionButton*>* > collButtons;
// collButtons m_btns;
typedef QMap<QModelIndex, QVector<QStyleOptionButton*> > vecButtons;
vecButtons m_VecBtns;
};
#endif // BUTTONDELEGATE_H
mainwindow.h :
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
};
#endif // MAINWINDOW_H
tablemodel.h:
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QAbstractTableModel>
class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit TableModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE;
void setData(const QVector<QStringList>& data) ;
QVector<QStringList>& DataVector() {return m_data;}
void setHorizontalHeader(const QStringList& headers);
~TableModel(void);
signals:
public slots:
private:
QStringList m_HorizontalHeader;
QVector<QStringList> m_data;
};
#endif // TABLEMODEL_H
tableview.h:
#ifndef TABLEVIEW_H
#define TABLEVIEW_H
#include <QTableView>
#include "tablemodel.h"
#include "buttondelegate.h"
class TableView : public QTableView
{
Q_OBJECT
public:
explicit TableView(QWidget *parent = 0);
TableModel* tableModel() {return m_model;}
~TableView();
signals:
public slots:
private:
void iniData();
private:
TableModel *m_model;
ButtonDelegate *m_buttonDelegate;
};
#endif // TABLEVIEW_H
buttondelegate.cpp:
#include "buttondelegate.h"
#include <QApplication>
#include <QMouseEvent>
#include <QMessageBox>
#include <QPainter>
#include <QStyleOption>
#include <QDesktopWidget>
#include <QDebug>
ButtonDelegate::ButtonDelegate(QObject *parent) :
QItemDelegate(parent)
{
m_btnCnt=3;//! 默认为3个按钮
}
void ButtonDelegate::createStyleOptionButton(QVector<QStyleOptionButton*> & vecBtns, QStringList &strtext) const
{
for(int i=0;i<strtext.count();i++)
{
QStyleOptionButton* pBtn = new QStyleOptionButton();
pBtn->text = strtext[i];
pBtn->state |= QStyle::State_Enabled;
vecBtns.append(pBtn);
}
}
void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QVector<QStyleOptionButton*> vecBtns=m_VecBtns.value(index);
if (0==vecBtns.count()) {
QStringList strtext;
if(m_btnCnt==1)
{
strtext<<tr("XXX");
}
if(m_btnCnt==2)
{
strtext<<tr("XXX")<<tr("YYY");
}
if(m_btnCnt==3)
{
strtext<<tr("XXX")<<tr("YYY")<<tr("ZZZ");
}
createStyleOptionButton(vecBtns, strtext);
(const_cast<ButtonDelegate *>(this))->m_VecBtns.insert(index, vecBtns);
}
int widLen=option.rect.width();
if(m_btnCnt==3)
{
vecBtns[0]->rect = option.rect.adjusted(0, 4, -(widLen*2/3 + 4) , -4);
vecBtns[1]->rect = option.rect.adjusted(widLen/3 + 4, 4, -(widLen/3+4), -4);
vecBtns[2]->rect = option.rect.adjusted(widLen*2/3 + 4 , 4, -4, -4);
}
if(m_btnCnt==2)
{
vecBtns[0]->rect = option.rect.adjusted(4, 4, -(widLen/2 + 4) , -4);
vecBtns[1]->rect = option.rect.adjusted(widLen/2 + 4, 4, -4, -4);
}
if(m_btnCnt==1)
{
vecBtns[0]->rect = option.rect.adjusted(0, 4, -4, -4);
}
painter->save();
if (option.state & QStyle::State_Selected) {
painter->fillRect(option.rect, option.palette.highlight());
}
painter->restore();
QApplication::style()->drawControl(QStyle::CE_PushButton, vecBtns[0], painter);
if(m_btnCnt>=2) QApplication::style()->drawControl(QStyle::CE_PushButton, vecBtns[1], painter);
if(m_btnCnt==3)QApplication::style()->drawControl(QStyle::CE_PushButton, vecBtns[2], painter);
}
bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent* e =(QMouseEvent*)event;
if (m_VecBtns.contains(index)) {
QVector<QStyleOptionButton*> btns = m_VecBtns.value(index);
if (btns[0]->rect.contains(e->x(), e->y())) {
btns[0]->state |= QStyle::State_Sunken;
}
else if(btns[1]->rect.contains(e->x(), e->y())) {
btns[1]->state |= QStyle::State_Sunken;
}
else if(btns[2]->rect.contains(e->x(), e->y())) {
btns[2]->state |= QStyle::State_Sunken;
}
}
}
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent* e =(QMouseEvent*)event;
if (m_VecBtns.contains(index)) {
QVector<QStyleOptionButton*> btns = m_VecBtns.value(index);
if (btns[0]->rect.contains(e->x(), e->y())) {
btns[0]->state &= (~QStyle::State_Sunken);
showMsg(tr("btn1 column %1").arg(index.column()));
} else if(btns[1]->rect.contains(e->x(), e->y())) {
btns[1]->state &= (~QStyle::State_Sunken);
showMsg(tr("btn2 row %1").arg(index.row()));
}
else if(btns[2]->rect.contains(e->x(), e->y())) {
btns[2]->state &= (~QStyle::State_Sunken);
showMsg(tr("btn2 row %1").arg(index.row()));
}
}
}
return true;
}
void ButtonDelegate::showMsg(QString str)
{
QMessageBox msg;
msg.setText(str);
msg.exec();
}
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp:
#include "mainwindow.h"
#include "tableview.h"
#include "tablemodel.h"
#include <QLayout>
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
this->resize(800, 600);
TableView *tv = new TableView(this);
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(tv);
this->setLayout(layout);
}
MainWindow::~MainWindow()
{
}
tablemodel.cpp:
#include "tablemodel.h"
TableModel::TableModel(QObject *parent) :
QAbstractTableModel(parent)
{
}
TableModel::~TableModel()
{
}
int TableModel::rowCount(const QModelIndex &parent) const
{
int i=m_data.size();
return i;
}
int TableModel::columnCount(const QModelIndex &parent) const
{
int j=m_HorizontalHeader.count();
return j;
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole) {
int ncol = index.column();
int nrow = index.row();
QStringList values = m_data.at(nrow);
if (values.size() > ncol)
return values.at(ncol);
else
return QVariant();
}
return QVariant();
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
Qt::ItemFlags flag = QAbstractItemModel::flags(index);
// flag|=Qt::ItemIsEditable // 设置单元格可编辑,此处注释,单元格无法被编辑
return flag;
}
void TableModel::setHorizontalHeader(const QStringList &headers)
{
m_HorizontalHeader = headers;
}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
return m_HorizontalHeader.at(section);
}
return QAbstractTableModel::headerData(section, orientation, role);
}
void TableModel::setData(const QVector<QStringList> &data)
{
m_data = data;
}
tableview.cpp:
#include "tableview.h"
#include "tablemodel.h"
#include "buttondelegate.h"
#include <QHeaderView>
TableView::TableView(QWidget *parent) :
QTableView(parent)
{
iniData();
}
TableView::~TableView()
{
delete m_model;
}
void TableView::iniData()
{
m_model = new TableModel();
this->setModel(m_model);
QStringList headers;
headers << "Id" << "Progress"<< "Progress-test";
m_model->setHorizontalHeader(headers);
QVector<QStringList> data;
data.append(QStringList() << "1" << "01"<< "Progress-test111");
data.append(QStringList() << "2" << "02"<< "Progress-test222");
data.append(QStringList() << "3" << "03"<< "Progress-test333");
data.append(QStringList() << "4" << "04"<< "Progress-test444");
data.append(QStringList() << "5" << "05"<< "Progress-test555");
m_model->setData(data);
m_buttonDelegate = new ButtonDelegate(this);
m_buttonDelegate->setBtnCnt(3);
// this->setItemDelegateForRow(1, m_buttonDelegate);
this->setItemDelegateForColumn(1, m_buttonDelegate);
emit m_model->layoutChanged();
this->setColumnWidth(1, 500);
this->horizontalHeader()->setStretchLastSection(true);
}
下面是QTABLEVIEW的一行中添加RADIO的例子:
下面是代码:
delegate_ItemRbtn_RadioBtn.h:
#ifndef delegate_ItemRbtn_RadioBtn_H #define delegate_ItemRbtn_RadioBtn_H #include <QApplication> #include <QMouseEvent> #include <QMessageBox> #include <QPainter> #include <QStyleOption> #include <QDesktopWidget> #include <QTableView> #include <QDebug> #include <QItemDelegate> #include <QObject> class QStrforRadioShowData: public QObject { Q_OBJECT public: explicit QStrforRadioShowData(QObject *parent = 0); ~QStrforRadioShowData(void); QString strcheck; QString struncheck; }; class RadioDelegateisOut : public QItemDelegate { Q_OBJECT public: explicit RadioDelegateisOut(QObject *parent = 0); void createStyleOptionButton(QStyleOptionButton *&vecBtns, QString &strtext) const; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) Q_DECL_OVERRIDE; private: QStrforRadioShowData strData; public: typedef QMap<QModelIndex, QStyleOptionButton* > vecButtons; vecButtons m_VecBtns; QVector<QString> m_RadioUserSel; }; #endif // BUTTONDELEGATE_H
tablemodel_ItemRbtn_isOut.h:
#ifndef TABLEMODEL_ISOUT_H #define TABLEMODEL_ISOUT_H #include <QAbstractTableModel> //#include "../PublicDataType.h" //#include "../PublicQStr.h" struct PExmlNeedData { QString strCol1Data; QStringList strCol2Data; }; class ItemRbtnisOutModel : public QAbstractTableModel { Q_OBJECT public: explicit ItemRbtnisOutModel(QObject *parent = 0); ~ItemRbtnisOutModel(void); int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE; Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; //Q_INVOKABLE virtual bool setTotalData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); public: //void setShowTotalData(QVector<sHorizontalHeader> &data) ; void setShowData(QVector<PExmlNeedData> &invalue, QVector<QString> &vecckUserValue, QVector<QString> &vecRadioUserValue); //QVector<sHorizontalHeader>& DataVector() {return m_SMSDTableModelTotalData;} void setHorizontalHeader(const QStringList &headers); QVariant getColData(QString strColTitle, PExmlNeedData &XMLlineData)const; int FindValueCol(QString invalue)const; public: QStringList m_HorizontalHeader;//! 水平头的数据显示 根据SMSDTableViewColSet.xml中的文件依次排列的数据 //QVector<sHorizontalHeader> m_SMSDTableModelTotalData;//! 所有的整体数据 QVector<PExmlNeedData> m_AllVecData;//! 根据读取的整体数据结合要显示的哪些列所存储的显示数据 QVector<QStringList> myBtnProces; QVector<QString> m_vecckUserValue; QVector<QString> m_vecRadioUserValue; int ckCol; int RadioCol; }; #endif
delegate_ItemRbtn_RadioBtn.cpp:
#include "delegate_ItemRbtn_RadioBtn.h" RadioDelegateisOut::RadioDelegateisOut(QObject *parent) : QItemDelegate(parent) { } void RadioDelegateisOut::createStyleOptionButton(QStyleOptionButton* & vecBtns, QString &strtext) const { QStyleOptionButton* pBtn = new QStyleOptionButton(); pBtn->text = strtext; pBtn->state |= QStyle::State_Enabled; vecBtns=pBtn; } void RadioDelegateisOut::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionButton* vecBtns=m_VecBtns.value(index); if (NULL==vecBtns) { QString strtext; strtext=strData.struncheck; createStyleOptionButton(vecBtns, strtext); (const_cast<RadioDelegateisOut *>(this))->m_VecBtns.insert(index, vecBtns); } int widLen=option.rect.width(); vecBtns->rect = option.rect.adjusted(0, 4, -4, -4); painter->save(); if (option.state & QStyle::State_Selected) { painter->fillRect(option.rect, option.palette.highlight()); } painter->restore();//忘了加此句,出现CONSOLE:QPainter::end: Painter ended with 2 saved states QApplication::style()->drawControl(QStyle::CE_RadioButton, vecBtns, painter); } bool RadioDelegateisOut::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { int r=index.row(); int c=index.column(); //Q_UNUSED( option) //Q_UNUSED( model) if (event->type() == QEvent::MouseButtonPress) { QMouseEvent* e =(QMouseEvent*)event; if (m_VecBtns.contains(index)) { QStyleOptionButton* btns = m_VecBtns.value(index); if (btns->rect.contains(e->x(), e->y())) { QStyle::State sold = btns->state; QStyle::State sisOn = sold&(0x000000f0); if(sisOn==QStyle::State_None) { btns->state|=QStyle::State_On; btns->text="checked"; } if(sisOn==QStyle::State_On) { btns->state&=(~QStyle::State_On); btns->text="unchecked"; //! 取消勾选 } m_RadioUserSel[r]=btns->text; } } } model->setData(index, m_RadioUserSel[r], Qt::CheckStateRole); return true; } QStrforRadioShowData::QStrforRadioShowData(QObject *parent) { strcheck=tr("checked"); struncheck=tr("unchecked"); } QStrforRadioShowData::~QStrforRadioShowData() { }
tablemodel_ItemRbtn_isOut.cpp:
#include "tablemodel_ItemRbtn_isOut.h" ItemRbtnisOutModel::ItemRbtnisOutModel(QObject *parent) : QAbstractTableModel(parent) { //m_vecckUserValue.clear(); } ItemRbtnisOutModel::~ItemRbtnisOutModel() { } int ItemRbtnisOutModel::rowCount(const QModelIndex &parent) const { Q_UNUSED( parent) int i=m_AllVecData.size(); return i; } int ItemRbtnisOutModel::columnCount(const QModelIndex &parent) const { Q_UNUSED( parent) int j=m_HorizontalHeader.size(); return j; } QVariant ItemRbtnisOutModel::getColData(QString strColTitle,PExmlNeedData &XMLlineData)const { //headers<<QString("parameterName")<<QString("parameterType")<<QString("Out-process-select"); if(strColTitle==tr("parameterName")) return XMLlineData.strCol1Data; // if(strColTitle==tr("parameterType")) // return XMLlineData.argTypeType; // if(strColTitle==tr("Value")) // return XMLlineData.default_value; // if(strColTitle==tr("valueRange")) // return XMLlineData.valueRange; // if(strColTitle==tr("valueUnit")) // return XMLlineData.valueUnit; // if(strColTitle==tr("desc")) // return XMLlineData.desc; // if(strColTitle==tr("paramIndex")) // return QString(tr("%1")).arg(XMLlineData.paramIndex); if(strColTitle==tr("Out-process-select"))//1、文件 2、数据库 3、推送 { QStringList ll=XMLlineData.strCol2Data; // ll.append(QLJTSTR::CHECK_FILE); // ll.append(QLJTSTR::CHECK_DATABASE); // ll.append(QLJTSTR::CHECK_PUSH); return ll; } //return QString(tr("%1%2%3")).arg(CHECK_FILE).arg(CHECK_DATABASE).arg(CHECK_PUSH); return ""; } int ItemRbtnisOutModel::FindValueCol(QString invalue) const { for(int i=0;i<m_HorizontalHeader.size();i++) { QString str = m_HorizontalHeader.at(i); if(invalue==str) return i; } return -1; } QVariant ItemRbtnisOutModel::data(const QModelIndex &index, int role) const { //qDebug()<<"ItemRbtnisOutModel::data-role"<<role; if (!index.isValid()) return QVariant(); int nrow = index.row(); int ncol = index.column(); PExmlNeedData XMLlineData = m_AllVecData.at(nrow); QString strColTitle = m_HorizontalHeader.at(ncol); if (role == Qt::DisplayRole) { QVariant strValue = this->getColData(strColTitle,XMLlineData); //qDebug()<<"ItemRbtnisOutModel::data"<<nrow<<ncol<<role<<strValue; return strValue; } if (role == Qt::CheckStateRole&&ncol==ckCol) { QString sList = m_vecckUserValue.at(nrow); //qDebug()<<"ItemRbtnisOutModel::data"<<nrow<<ncol<<role<<sList; return sList; } if (role == Qt::CheckStateRole&&ncol==RadioCol) { QString sList = m_vecRadioUserValue.at(nrow); //qDebug()<<"ItemRbtnisOutModel::data"<<nrow<<ncol<<role<<sList; return sList; } return QVariant(); } bool ItemRbtnisOutModel::setData(const QModelIndex &index, const QVariant &value, int role) { int row = index.row(); int col=index.column(); if (index.isValid() && role == Qt::CheckStateRole &&col==ckCol) { QString strnow = value.toString(); m_vecckUserValue[row]=strnow; //qDebug()<<"tableArrorRbtnModel::setData"<<strnow; emit dataChanged(index, index); return true; } if (index.isValid() && role == Qt::CheckStateRole &&col==RadioCol) { QString strnow = value.toString(); m_vecRadioUserValue[row]=strnow; //qDebug()<<"tableArrorRbtnModel::setData"<<strnow; emit dataChanged(index, index); return true; } return false; } Qt::ItemFlags ItemRbtnisOutModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; Qt::ItemFlags flags = QAbstractItemModel::flags(index); int col = index.column(); if(col==ckCol) flags |= Qt::ItemIsEditable; if(col==RadioCol) flags |= Qt::ItemIsEditable; return flags; } void ItemRbtnisOutModel::setHorizontalHeader(const QStringList& headers) { m_HorizontalHeader = headers; ckCol=FindValueCol(tr("Out-process-select")); RadioCol=FindValueCol(tr("isActive")); } QVariant ItemRbtnisOutModel::headerData(int section, Qt::Orientation orientation, int role) const { int m=m_HorizontalHeader.size(); if(m==0) return QVariant(); if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { QString strTemp=m_HorizontalHeader.at(section); //QString strTemp=QString::fromLocal8Bit(ss.c_str()); //QString strTemp=QString::fromStdString(ss.c_str()); //QString strTemp(ss.c_str()); //QVariant vaTemp(strTemp); return strTemp; } return QAbstractTableModel::headerData(section, orientation, role); } void ItemRbtnisOutModel::setShowData(QVector<PExmlNeedData> &invalue,QVector<QString> &vecckUserValue,QVector<QString> &vecRadioUserValue) { m_AllVecData.clear(); m_AllVecData=invalue; m_vecckUserValue.clear(); m_vecckUserValue=vecckUserValue; m_vecRadioUserValue.clear(); m_vecRadioUserValue=vecRadioUserValue; }mainwindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "delegate_ItemRbtn_RadioBtn.h" #include "tablemodel_ItemRbtn_isOut.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void initTabView(QVector<PExmlNeedData> &invalue, QVector<QString> &vecRadioUserValue); public slots: void getRadioValue(); private: Ui::MainWindow *ui; ItemRbtnisOutModel *m_isOutmodel; RadioDelegateisOut *m_isOutDelegate; }; #endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h" #include <QTranslator> #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QVector<PExmlNeedData> invalue; PExmlNeedData r0; r0.strCol1Data="strCol1Data"; r0.strCol2Data<<"strCol2Data--000"<<"strCol2Data--011"<<"strCol2Data--022"; PExmlNeedData r1; r1.strCol1Data="strCol1Data"; r1.strCol2Data<<"strCol2Data--100"<<"strCol2Data--111"<<"strCol2Data--122"; invalue.push_back(r0);invalue.push_back(r1); QVector<QString> vecRadioUserValue; QString s0;s0="unchecked"; QString s1;s1="unchecked"; vecRadioUserValue.push_back(s0); vecRadioUserValue.push_back(s1); initTabView(invalue,vecRadioUserValue); connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(getRadioValue())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initTabView(QVector<PExmlNeedData> &invalue,QVector<QString> &vecRadioUserValue) { m_isOutmodel = new ItemRbtnisOutModel(this); QStringList headers; headers<<QString(tr("parameterName"))<<QString(tr("Out-process-select"))<<QString(tr("isActive")); m_isOutmodel->setHorizontalHeader(headers); m_isOutmodel->setShowData(invalue,vecRadioUserValue,vecRadioUserValue); ui->tableView_isOut->setSelectionBehavior(QAbstractItemView::SelectRows); //m_pageRes.tableView_isOut->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableView_isOut->setSelectionMode(QTableView::SingleSelection); //m_pageRes.tableView_isConf->setColumnWidth(colIndex+ipsCnt, 50); ui->tableView_isOut->horizontalHeader()->setStretchLastSection(true); ui->tableView_isOut->setModel(m_isOutmodel); int allColCnt = headers.size(); m_isOutDelegate = new RadioDelegateisOut(this); m_isOutDelegate->m_RadioUserSel=vecRadioUserValue; ui->tableView_isOut->setItemDelegateForColumn(allColCnt-1, m_isOutDelegate); } void MainWindow::getRadioValue() { QVector<QString> getRadioSel=m_isOutmodel->m_vecRadioUserValue; qDebug()<<"getRadioSel"<<getRadioSel; }
main.cpp:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); // LangSwitch w; // w.show(); return a.exec(); }最后忘了添加更新EDITOR的代码了,下面只写出CPP代码:
void RadioDelegateisOut::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); }
相关文章推荐
- Qt之QTableView添加复选框(QAbstractItemDelegate)
- Qt之QTableView添加复选框(QAbstractItemDelegate)
- Pyqt4学习笔记-对话框(更新ing)
- Qt 5.6更新至RC版,最终版本近在咫尺
- QT5-控件-QScrollArea-可以用于把一个窗口分割为多个-比如根据图片大小显示滚动条
- [QT]拖拽改变控件大小
- Qt5-控件-QRadioButton-单选按钮-用于从多个选项中选取一个-单选神器
- 信号槽所用的参数类型,必须是Qt能认识的元类型,否则就要调用Q_DECLARE_METATYPE和qRegisterMetaType进行注册
- Pyqt4学习笔记-事件和信号
- QT5-控件-QProgressBar-进度条-用来做下载进度,文件读取进度还不错
- Qt5-控件-QMenu,QMenuBar-菜单栏详解-菜单热键-菜单校验功能
- QToolBar也是QWidget,可以放在QWidget的中间
- QT5-控件-QLabel和QLCDNumber-标签显示图片或者视频,LCD用于上位机不错
- QT5-控件-QFontComboBox-字体选择下拉列表,使用一个标签查看效果
- Qt反射
- Qt之QTableView添加复选框(QAbstractTableModel)
- Qt之QTableView添加复选框(QAbstractTableModel)
- Qt中信号和槽机制
- QT5控件-QPushButton和QFocusFrame(按钮和焦点框)
- QT5-控件-QSpinBox和QDoubleSpinBox(用于通过控件调整整数和小数)