当前位置: 首页 > news >正文

网站建设20推广网站怎么建立

网站建设20推广,网站怎么建立,个人网页设计与友情链接论文,做维修那个网站发布信息好一、概念 在Qt框架中,QListView、QListWidget、QTableView和QTableWidget都是用于显示列表或表格数据的控件。 QListView是一个基于模型-视图架构的控件,用于展示列表形式的数据。它本身并不存储数据,而是依赖于一个QAbstractListModel或其子…

一、概念

        在Qt框架中,QListView、QListWidget、QTableView和QTableWidget都是用于显示列表或表格数据的控件。
QListView是一个基于模型-视图架构的控件,用于展示列表形式的数据。它本身并不存储数据,而是依赖于一个QAbstractListModel或其子类(如QStandardItemModel)来提供数据。
QListWidget是一个更为直接、易于使用的列表控件,它内部已经集成了一个简单的模型,可以直接添加、删除和修改项。
QTableView是一个基于模型-视图架构的表格控件,用于展示表格形式的数据。同样需要关联一个QAbstractTableModel或其子类(如QStandardItemModel)来提供数据。
QTableWidget是一个集成模型的表格控件,可以直接添加、删除和修改单元格数据。

二、架构与数据模型

控件架构类型数据模型继承关系
QListView视图类需外部模型(如 QStandardItemModel)‌继承自 QAbstractItemView
QListWidgetWidget类内置 QListWidgetItem 模型 ‌继承自 QListView
QTableView视图类需外部模型(如 QStandardItemModel、QSqlTableModel等)‌继承自 QAbstractItemView
QTableWidgetWidget类内置 QTableWidgetItem 模型 ‌继承自 QTableView

核心差异‌:

  • 视图类‌(QListView/QTableView)与模型分离,需手动绑定模型,灵活性高,适合动态数据处理‌。
  • Widget类‌(QListWidget/QTableWidget)内置模型,直接操作项(Item),开发效率高,但扩展性受限‌。

三、功能与适用场景

控件优势场景局限性
QListView动态数据绑定、多视图共享模型、自定义委托(Delegate)‌需编写模型逻辑,开发复杂度较高‌
QListWidget快速实现静态列表、少量数据展示(如配置项)‌数据量大时性能下降,难以扩展‌
QTableView多列数据展示、复杂表格逻辑(如数据库交互)‌需自定义模型,代码量较大‌
QTableWidget快速创建简单表格(如数据录入界面)‌无法复用模型,数据量大时性能低‌

四、优势

视图类优势‌:

  • 支持数据复用,适合动态更新和大数据量(如千级条目)‌。
  • 可通过委托(Delegate)自定义项渲染和交互逻辑‌。
    ‌示例‌:
    // QTableView 绑定数据库模型
    QSqlTableModel *model = new QSqlTableModel;
    model->setTable("employees");
    QTableView *view = new QTableView;
    view->setModel(model);

利用QItemDelegate,开发者可以为特定的列或者行定制绘制的样式,还可以定义编辑控件和编辑行为。它可以被用于处理复杂的编辑任务,比如自定义的下拉选择器或者复杂的输入验证。
Qt 提供了另外的基于组件的子类:QItemDelegate和 QStyledItemDelegate。默认的委托是 QStyledItemDelegate。二者的区别在于绘制和向视图提供编辑器的方式。QStyledItemDelegate使用当前样式绘制,并且能够使用 Qt Style Sheet,因此我们推荐在自定义委托时,使用 QStyledItemDelegate作为基类。
1)一个典型的使用QItemDelegate的场景是自定义表格视图中单元格的绘制和编辑方式。以下是一个简单的示例,展示了如何使用QItemDelegate来绘制一个带有特殊背景的单元格: 

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QItemDelegate>class CustomDelegate : public QItemDelegate {
public:CustomDelegate(QObject *parent = nullptr) : QItemDelegate(parent) {}void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {// 调用基类的paint方法绘制默认样式QItemDelegate::paint(painter, option, index);// 自定义绘制逻辑painter->setBrush(QColor("orange")); // 设置背景色painter->drawRect(option.rect); // 绘制矩形填充背景}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);QTableView tableView;QStandardItemModel model(5, 3); // 创建5行3列的数据模型CustomDelegate delegate; // 创建委托对象tableView.setModel(&model);tableView.setItemDelegate(&delegate); // 设置自定义委托for (int row = 0; row < 5; ++row) {for (int column = 0; column < 3; ++column) {QModelIndex index = model.index(row, column, QModelIndex());model.setData(index, QString("Item %1").arg(row * 3 + column), Qt::DisplayRole);}}tableView.show();return app.exec();
}

2)要创建一个有效的自定义 QItemDelegate 类,需要考虑以下几点:
继承 :从QStyledItemDelegate 继承,这取决于是否需要使用到Qt的样式系统。
构造函数 :定义构造函数以接受可能的参数,例如颜色或字体。
重写方法 :重写 createEditor 、 setEditorData 、 setModelData 、 updateEditorGeometry 、 paint 和 sizeHint 方法以提供自定义行为。
事件处理 :处理事件(如 鼠标事件 和 键盘事件 ),以实现特定的交互。
下面是一个自定义委托的示例,它提供了一个自定义的编辑器,用于编辑整数值: 

class IntegerDelegate : public QStyledItemDelegate {
public:IntegerDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}// 重写createEditor创建整数编辑器QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override {return new QSpinBox(parent);}// 将模型数据设置到编辑器中void setEditorData(QWidget *editor, const QModelIndex &index) const override {QSpinBox *spinBox = qobject_cast<QSpinBox *>(editor);if (!spinBox) return;spinBox->setValue(index.model()->data(index, Qt::EditRole).toInt());}// 将编辑器数据写回模型void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override {QSpinBox *spinBox = qobject_cast<QSpinBox *>(editor);if (!spinBox) return;model->setData(index, spinBox->value(), Qt::EditRole);}
};
#include <QStyledItemDelegate>
#include <QSpinBox>
#include <QComboBox>
#include <QPainter>class CustomDelegate : public QStyledItemDelegate {
public:explicit CustomDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) {}// 1. 创建编辑器控件QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override {if (index.column() == 0) { // 第一列使用数字输入框QSpinBox* editor = new QSpinBox(parent);editor->setRange(0, 100);return editor;} else if (index.column() == 1) { // 第二列使用下拉框QComboBox* editor = new QComboBox(parent);editor->addItems({"Option A", "Option B", "Option C"});return editor;}return QStyledItemDelegate::createEditor(parent, option, index);}// 2. 将模型数据加载到编辑器void setEditorData(QWidget* editor, const QModelIndex& index) const override {if (index.column() == 0) {int value = index.data(Qt::EditRole).toInt();QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor);spinBox->setValue(value);} else if (index.column() == 1) {QString text = index.data(Qt::EditRole).toString();QComboBox* comboBox = qobject_cast<QComboBox*>(editor);comboBox->setCurrentText(text);} else {QStyledItemDelegate::setEditorData(editor, index);}}// 3. 将编辑器数据写回模型void setModelData(QWidget* editor, QAbstractItemModel* model,const QModelIndex& index) const override {if (index.column() == 0) {QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor);model->setData(index, spinBox->value(), Qt::EditRole);} else if (index.column() == 1) {QComboBox* comboBox = qobject_cast<QComboBox*>(editor);model->setData(index, comboBox->currentText(), Qt::EditRole);} else {QStyledItemDelegate::setModelData(editor, model, index);}}// 4. 调整编辑器位置和尺寸void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option,const QModelIndex& index) const override {editor->setGeometry(option.rect.adjusted(2, 2, -2, -2)); // 边缘留2像素空隙}// 5. 自定义绘制逻辑void paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index) const override {if (index.column() == 2) { // 第三列绘制进度条int progress = index.data(Qt::UserRole).toInt();QStyleOptionProgressBar progressBarOption;progressBarOption.rect = option.rect.adjusted(5, 5, -5, -5);progressBarOption.minimum = 0;progressBarOption.maximum = 100;progressBarOption.progress = progress;progressBarOption.text = QString::number(progress) + "%";progressBarOption.textVisible = true;QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);} else {QStyledItemDelegate::paint(painter, option, index);}}// 6. 控制项尺寸QSize sizeHint(const QStyleOptionViewItem& option,const QModelIndex& index) const override {if (index.column() == 2) { // 进度列需要更大高度return QSize(200, 30); }return QStyledItemDelegate::sizeHint(option, index);}
};

Widget类优势‌:

  • 简化操作(如 addItem()setItem()),适合快速开发‌。
  • 支持直接嵌入自定义控件(如 setItemWidget())‌。
    ‌示例‌:
    // QListWidget 添加带图标的项
    QListWidgetItem *item = new QListWidgetItem("Text");
    item->setIcon(QIcon("icon.png"));
    listWidget->addItem(item);
http://www.cadmedia.cn/news/10399.html

相关文章:

  • 网络规划设计师和信息系统项目管理师哪个好考国内seo公司
  • 湖南网站推广营销设计baidu百度首页官网
  • 贵州网站建设套餐哈尔滨seo优化公司
  • 微梦网站建设营销怎么做
  • 做淘宝还是做网站国外域名注册平台
  • onethink做的企业网站行业门户网站推广
  • 泉州营销型网站建设模板建站
  • 深圳最新疫情报告快速排名优化公司
  • 网站综合开发怎么做北京网站建设公司案例
  • 保定网站制作哪家好建设成都新闻今日最新消息
  • 涉县移动网站建设价格百度网站关键词优化
  • wordpress主题发布百度关键词seo优化
  • 香港外贸网站建设aso优化重要吗
  • mip网站建设公司seo免费优化软件
  • 焦作网站建设哪家权威全网整合营销推广方案
  • 莱芜东风街吧百度贴吧学seo优化
  • 厦门网站设计多少钱广州网站优化费用
  • 网站建设实录音乐网站关键词seo费用
  • 莒县网站建设怎样进行网络推广效果更好
  • 百度站长平台app巩义网站推广优化
  • 现在做网站一般做多宽常州网络推广平台
  • 不能用于制作网页的软件网站的seo优化报告
  • 老河口网站建设微商引流一般用什么软件
  • 石家庄58同城招聘信息快速网站seo效果
  • 广告设计与制作专业专升本百度快照优化seo
  • 保健品网站建设案例b2b关键词排名工具
  • 山西省建筑工程网广州网站优化平台
  • 知舟网站建设徐州seo顾问
  • 请简述网站建设的方法百度竞价排名一年费用
  • 中国建设网官网网站百度一下官方网页