qt的mvc自定义的实现,v的前5列都是文本,第6列选择框,第7列为按钮,双击行出现下拉菜单,可以修改该行的内容。请用代码实现
时间: 2024-03-11 22:43:34 浏览: 22
以下是一个简单的示例代码,实现了一个基于Qt的MVC模式的表格,其中前5列为文本,第6列为选择框,第7列为按钮。双击行可以弹出下拉菜单进行修改。
```cpp
// 定义数据模型类
class MyModel : public QAbstractTableModel
{
public:
MyModel(QObject *parent = nullptr)
: QAbstractTableModel(parent)
{
// 初始化数据
m_data = {
{"Apple", "Fruit", "Red", "10", "1", false},
{"Orange", "Fruit", "Orange", "20", "2", true},
{"Banana", "Fruit", "Yellow", "30", "3", false},
{"Cucumber", "Vegetable", "Green", "40", "4", true},
{"Carrot", "Vegetable", "Orange", "50", "5", false},
};
}
// 返回行数
int rowCount(const QModelIndex &parent = QModelIndex()) const override
{
return m_data.size();
}
// 返回列数
int columnCount(const QModelIndex &parent = QModelIndex()) const override
{
return 7;
}
// 返回指定索引的数据
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
{
if (role == Qt::DisplayRole || role == Qt::EditRole) {
switch (index.column()) {
case 0:
return m_data[index.row()].name;
case 1:
return m_data[index.row()].category;
case 2:
return m_data[index.row()].color;
case 3:
return m_data[index.row()].price;
case 4:
return m_data[index.row()].id;
case 5:
return m_data[index.row()].selected;
default:
break;
}
}
return QVariant();
}
// 设置指定索引的数据
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
{
if (role == Qt::EditRole) {
switch (index.column()) {
case 0:
m_data[index.row()].name = value.toString();
break;
case 1:
m_data[index.row()].category = value.toString();
break;
case 2:
m_data[index.row()].color = value.toString();
break;
case 3:
m_data[index.row()].price = value.toString();
break;
case 4:
m_data[index.row()].id = value.toString();
break;
case 5:
m_data[index.row()].selected = value.toBool();
break;
default:
return false;
}
emit dataChanged(index, index);
return true;
}
return false;
}
// 返回表头数据
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return tr("Name");
case 1:
return tr("Category");
case 2:
return tr("Color");
case 3:
return tr("Price");
case 4:
return tr("ID");
case 5:
return tr("Selected");
case 6:
return tr("Action");
default:
break;
}
}
return QVariant();
}
// 返回指定索引的单元格的编辑类型
Qt::ItemFlags flags(const QModelIndex &index) const override
{
if (index.column() == 5) {
return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
} else {
return Qt::ItemIsEnabled | Qt::ItemIsEditable;
}
}
private:
// 定义表格中的数据项
struct Item {
QString name;
QString category;
QString color;
QString price;
QString id;
bool selected;
};
QVector<Item> m_data; // 存储表格数据
};
// 定义委托类
class MyDelegate : public QStyledItemDelegate
{
public:
MyDelegate(QObject *parent = nullptr)
: QStyledItemDelegate(parent)
{
}
// 绘制单元格
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 5) {
// 绘制选择框
QStyleOptionButton checkBoxOption;
checkBoxOption.rect = option.rect;
checkBoxOption.state |= (index.model()->data(index, Qt::DisplayRole).toBool() ? QStyle::State_On : QStyle::State_Off);
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxOption, painter);
} else if (index.column() == 6) {
// 绘制按钮
QStyleOptionButton buttonOption;
buttonOption.rect = option.rect;
buttonOption.text = tr("Edit");
QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter);
} else {
// 绘制文本
QStyledItemDelegate::paint(painter, option, index);
}
}
// 创建编辑器
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 5) {
// 创建选择框
QCheckBox *checkBox = new QCheckBox(parent);
checkBox->setChecked(index.model()->data(index, Qt::DisplayRole).toBool());
return checkBox;
} else {
// 创建文本输入框
QLineEdit *editor = new QLineEdit(parent);
editor->setText(index.model()->data(index, Qt::DisplayRole).toString());
return editor;
}
}
// 更新编辑器
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
if (index.column() == 5) {
// 更新选择框
QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
checkBox->setChecked(index.model()->data(index, Qt::DisplayRole).toBool());
} else {
// 更新文本输入框
QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
lineEdit->setText(index.model()->data(index, Qt::DisplayRole).toString());
}
}
// 将修改后的数据写回模型
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
if (index.column() == 5) {
// 更新选择框
QCheckBox *checkBox = static_cast<QCheckBox *>(editor);
model->setData(index, checkBox->isChecked(), Qt::EditRole);
} else {
// 更新文本输入框
QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
model->setData(index, lineEdit->text(), Qt::EditRole);
}
}
// 返回单元格的大小
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
if (index.column() == 5 || index.column() == 6) {
return QSize(20, 20);
} else {
return QStyledItemDelegate::sizeHint(option, index);
}
}
// 响应双击事件
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
{
if (event->type() == QEvent::MouseButtonDblClick && index.column() == 0) {
// 弹出下拉菜单
QStringList items = { "Apple", "Orange", "Banana", "Cucumber", "Carrot" };
bool ok = false;
QString item = QInputDialog::getItem(option.widget, tr("Select Item"), tr("Item:"), items, 0, false, &ok);
if (ok) {
model->setData(index, item, Qt::EditRole);
}
return true;
} else {
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
}
};
// 定义窗口类
class MyWindow : public QWidget
{
public:
MyWindow(QWidget *parent = nullptr)
: QWidget(parent)
{
// 创建表格和数据模型
m_tableView = new QTableView(this);
m_model = new MyModel(this);
m_tableView->setModel(m_model);
// 设置委托
m_delegate = new MyDelegate(this);
m_tableView->setItemDelegate(m_delegate);
// 布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(m_tableView);
setLayout(layout);
}
private:
QTableView *m_tableView; // 表格控件
MyModel *m_model; // 数据模型
MyDelegate *m_delegate; // 委托
};
```
使用方法:
```cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWindow window;
window.show();
return app.exec();
}
```
运行程序即可看到一个带有下拉菜单、选择框和按钮的表格。