文档章节

跟我一起学QT14:组合部件的使用

fzyz_sb
 fzyz_sb
发布于 2014/11/25 20:38
字数 566
阅读 159
收藏 0

0. 源代码下载

https://github.com/leichaojian/qt/tree/master/Combowidgetmapper

1. 程序效果图


2. 源代码解析

1. 主框架类Combowidgetmapper的定义


class Combowidgetmapper : public QWidget
{
    Q_OBJECT

public:
    explicit Combowidgetmapper(QWidget *parent = 0);
    ~Combowidgetmapper();

private slots:
    //用于更新previousButton和nextButton按钮是否有效
    void updateButtons(int row);

private:
    //设定模型
    void setupModel();

    QLabel *nameLabel;
    QLabel *addressLabel;
    QLabel *typeLabel;
    QLineEdit *nameEdit;
    QTextEdit *addressEdit;
    QComboBox *typeComboBox;
    QPushButton *nextButton;
    QPushButton *previousButton;

    QStandardItemModel *model;
    QStringListModel *typeModel;
    QDataWidgetMapper *mapper;

private:
    Ui::Combowidgetmapper *ui;
};

2. 主框架类Combowidgetmapper的实现

1. 基础界面布局


nameLabel = new QLabel(tr("Na&me:"));
    nameEdit = new QLineEdit();
    addressLabel = new QLabel(tr("&Address:"));
    addressEdit = new QTextEdit();
    typeLabel = new QLabel(tr("&Type:"));
    typeComboBox = new QComboBox();
    nextButton = new QPushButton(tr("&Next"));
    previousButton = new QPushButton(tr("&Previous"));

    //设定伙伴关系--例如对nameLabel使用快捷键时候,会自动跳到nameEdit上
    nameLabel->setBuddy(nameEdit);
    addressLabel->setBuddy(addressEdit);
    typeLabel->setBuddy(typeComboBox);



    而我们可以通过QGridLayout来实现布局:



//界面布局
    QGridLayout *layout = new QGridLayout();
    layout->addWidget(nameLabel, 0, 0, 1, 1);
    layout->addWidget(nameEdit, 0, 1, 1, 1);
    layout->addWidget(previousButton, 0, 2, 1, 1);
    layout->addWidget(addressLabel, 1, 0, 1, 1);
    layout->addWidget(addressEdit, 1, 1, 2, 1);
    layout->addWidget(nextButton, 1, 2, 1, 1);
    layout->addWidget(typeLabel, 3, 0, 1, 1);
    layout->addWidget(typeComboBox, 3, 1, 1, 1);
    setLayout(layout);



2. 模型和界面部件的关联


//typeModel为QStringListModel *,存储三个基本数据:Home,Work和Other
    typeComboBox->setModel(typeModel);

    //mapper用于存储输入的数据
    mapper = new QDataWidgetMapper(this);
    mapper->setModel(model);
    mapper->addMapping(nameEdit, 0);
    mapper->addMapping(addressEdit, 1);
    //由于typeComboBox是通过模型typeModel来读取的,所以我们需要currentIndex属性来获取数据
    mapper->addMapping(typeComboBox, 2, "currentIndex");



3. 模型中数据的导入


void Combowidgetmapper::setupModel()
{
    QStringList items;
    items << tr("Home") << tr("Work") << tr("Other");
    typeModel = new QStringListModel(items, this);

    //创建一个5行3列的模型
    model = new QStandardItemModel(5, 3, this);
    QStringList names;
    names << "Alice" << "Bob" << "Carol" << "Donald" << "Emma";
    QStringList addresses;
    addresses << "<qt>123 Main Street<br/>Market Town</qt>"
              << "<qt>PO Box 32<br/>Mail Handling Service"
                 "<br/>Service City</qt>"
              << "<qt>The Lighthouse<br/>Remote Island</qt>"
              << "<qt>47338 Park Avenue<br/>Big City</qt>"
              << "<qt>Research Station<br/>Base Camp<br/>Big Mountain</qt>";

    QStringList types;
    types << "0" << "1" << "2" << "0" << "2";

    //将数据分别写入模型中
    for (int row = 0; row < 5; ++row) {
        QStandardItem *item = new QStandardItem(names[row]);
        model->setItem(row, 0, item);
        item = new QStandardItem(addresses[row]);
        model->setItem(row, 1, item);
        item = new QStandardItem(types[row]);
        model->setItem(row, 2, item);
    }
}



4. 信号槽的编写


//信号槽的编写
    connect(previousButton, SIGNAL(clicked()),
            mapper, SLOT(toPrevious()));
    connect(nextButton, SIGNAL(clicked()),
            mapper, SLOT(toNext()));
    connect(mapper, SIGNAL(currentIndexChanged(int)),
            this, SLOT(updateButtons(int)));








© 著作权归作者所有

fzyz_sb
粉丝 411
博文 209
码字总数 447144
作品 0
武汉
程序员
私信 提问
组合模式(composite)--结构型模式之六

1. 意图 将对象组合成树形结构以表示“部分 -整体”的层次结构。 Composite使得用户对单个对象 和组合对象的使用具有一致性。 2. 动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户...

长平狐
2013/04/25
87
0
中秋送福利啦~~~陪学网课程冰点价88元,《产品解析与实战》立减580元!

中秋即将来临, 一起订个小目标如何? 比如在陪学网拿到一个由教育厅颁发的产品经理 《岗位任职合格证书》 欢聚中秋,陪学网邀请乐享特惠啦。。。 特惠1《产品解析与实战》 课程链接:http:...

陪学-施米诺
2016/09/06
19
0
中秋送福利啦~~~陪学网课程冰点价88元,《产品解析与实战》立减580元!

中秋即将来临, 一起订个小目标如何? 比如在陪学网拿到一个由教育厅颁发的产品经理 《岗位任职合格证书》 欢聚中秋,陪学网邀请乐享特惠啦。。。 特惠1《产品解析与实战》 课程链接:http:...

陪学-施米诺
2016/09/06
0
0
We7 2.7 测试版发布:全拖拽建站——梦想照进现实!

1、挑战极限——模板拖拽式在线设计 全部采用最新的模板在线拖拽设计系统完成。 一般的拖拽系统都是采用目前博客系统使用的模式,版式固定,部件也是固定的,在固定的版式里进行拖拽,取得一...

Steve Wone
2010/12/13
2.5K
0
初识Silverlight 4及其架构

简介 才开始学Silverlight 4。本文将谈到对Silverlight 4最初步的认识,同时将从多个角度谈一些与Silverlight 4架构有关的认识。 Silverlight 4是今年早些时候发布的。这项技术为我们带来了许...

mikelij
2010/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我为什么要写微信公众号

埋一颗种子,细心呵护,静待她枝繁叶茂,葱郁参天 V2论坛上有个帖子【做程序员最重要的还是一定要有自己的作品】,作者写道: 能有一个作品和你的名字联系在一起,应当成为在职业生涯前期着意...

运维咖啡吧
52分钟前
3
0
数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
5
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
8
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部