>

其实写UI是很简单的澳门博发娱乐官网,其实写

- 编辑:澳门博发娱乐官网 -

其实写UI是很简单的澳门博发娱乐官网,其实写

 那是自家在项目实战中的个人计算,写的仓促,有些东西也不自然标准,有些是友善推测的,还指望各位多多照顾,多多商量。

高效支付QCombox以及业务样式自定义,qcombox样式自定义

 这是本身在档次实战中的个人总计,写的急促,某些东西也不自然标准,有些是和煦推测的,还指望各位多都赐教,多多斟酌。

 关于QCombox若是无需自定义,其实写UI是非常的粗略的。

成立实例:QComboBox*  m_pMicrophoneCombox = new QComboBox;

自家是用的QSS去的写样式,这里用了一个命名函数:m_pMicrophoneCombox->setObjectName("DeviceCombox");

一经是用的setstylesheet间接在代码里去写就好了。

下边说多少个性情函数:

m_pMicrophoneCombox->set马克斯VisibleItems(2);//最大可知区域为展现两条。

m_pMicrophoneCombox->setEditable(false); //设置QComboBox可编辑。

m_pMicrophoneCombox->setFocusPolicy(Qt::NoFocus);//设置QCombox未有毛病。

m_pMicrophoneCombox->setLineEdit(edit);//edit是贰个lineedit,正是说QCombox的LineEdit能够自定义,而QT的源码中,顶上部分也是叁个LineEdit。

m_pMicrophoneCombox->setCurrentIndex(0); // 设置当前入选的目录。

m_pMicrophoneCombox->setCurrentText(TR_TALK_DEVICE_COMBOX);//设置QCombox当前的来得text,作者是用宏封装的,满意中期修改。

m_pMicrophoneCombox->setItemData(i, list[i]);//QCombox也足以友善传入贰个链表,何况本身定义索引,当然,你想传一条数据,况兼本身定义索引。

QListWidget* pListWidget = new QListWidget();//new一个widget的实例。

m_pMicrophoneCombox->setModel(pListWidget->model());//塞进widget的model。
m_pMicrophoneCombox->setView(pListWidget);//将widget装进Combox。

m_pMicrophoneCombox->count();//用来测算combox下拉窗体的尺寸。

m_pMicrophoneCombox->addItems(list);//插入叁个列表。

m_pMicrophoneCombox->addItem("111");//插入单条数据。

上述函数基本满意职业供给,借使交互的样式比较复杂,须求自定义样式,那样的话,我们将要和睦去写每一个item的样式。

浅析下QCombox的源码,其实他的完毕正是贰个LineEdit和二个ListWidget,知道啊那么些就足以团结去重新写二个ListWidget。

Item *pItem = new Item(); //item是和睦自定义写的布局,每三个item的自定义样式就能够写在那个里面。
QListWidgetItem *pListWidgetItem = new QListWidgetItem(list[i],pListWidget);//笔者是将链表的多少塞进QCombox里。
pItem->setItemData(list[i]);//给每三个item塞进多少
pListWidget->setItemWidget(pListWidgetItem, pItem);//关于这些函数作者的了然是:在底下一层上边再覆盖一层。

下一场在QSS的样式里写hover、pressed鼠标事件,就有鼠标的相互。

这种措施固然平价,不过多少不与UI分离,都搅在一团。

至上的方案正是:

  既然QT的combox帮助listwidget,那么全部都用自个儿定制的listwidget。

 在itemwidget里写布局,本人搞二个delegate,在代理去管理UI,数据在model里去操作,这里的model只怕要协和包裹一层,满意combox的相互供给。

pListWidget->m_pModel->Append(list[i]);//将每三个数额塞进model,剩下的数量操作就由model去管理。

新鲜注意的是:那个时候,qt原生的那么些接口都不奏效了,举个例子:setcurrenttext还会有setcurrentindex,查看源码发掘都是依照索引来操控,而实际上,大家用自身的model

去管理的多寡,并不会调换一个目录来知足combox处理的数量,所以这一个对外的接口大概也要团结去封装出来,能够说基本上是吐弃了combox,本身去组装LineEdit和ListWidget。

骨子里代码量是成都百货上千的,公司事情可以去封装成控件,方便开荒。

    最终,假如大神们有更加好的法子,接待商量。

 

 

那是本人在档案的次序实战中的个人计算,写的急促,某些东西也不自然标准,某些是本身推...

QTableWidget是QT程序中常用的突显数据表格的上空,很周围于VC、C#中的DataGrid。聊起QTableWidget,就务须讲一下它跟QTabelView的界别了。QTableWidget是QTableView的子类,首要的区分是QTableView能够行使自定义的数据模型来呈现内容(也正是先要通过setModel来绑定数据源),而QTableWidget则只可以选用规范的数据模型,况兼其单元格数据是QTableWidgetItem的靶子来促成的(也等于无需数据源,将每种单元格内的新闻填好就能够)。那至关心爱戴要反映在QTableView类中有setModel成员函数,而到了QTableWidget类中,该成员函数形成了私有。使用QTableWidget就离不开QTableWidgetItem。QTableWidgetItem用来表示表格中的二个单元格,正个表格都急需用每种单元格营造起来。

记录下使用QListView蒙受的各个难题

 关于QCombox要是无需自定义,其实写UI是很简短的。

 

QListView可以用来以列表的样式显得数据,在Qt中利用model/View结构来保管数据与视图的涉及,model负担数据的存取,数据的互动通过delegate来达成。

创制实例:QComboBox*  m_pMicrophoneCombox = new QComboBox;

[cpp] view plaincopy

加上数据模型

QT提供了有些现有的models用于拍卖数量项:
QStringListModel 用于存款和储蓄轻便的QString列表。
QStandardItemModel 处理复杂的树型结构数据项,每项都能够包蕴自由数据。
QDirModel 提供地点文件系统中的文件与目录消息。
QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来访谈数据库。

选用Qt自带的模型类QStandardItemModel就可以。模型中的每一个数据项都有三个与之对应的role来囤积某一类数据。供给存取自定义数据可以接纳UserRole,UserRole+1...

对于自定义数据类型,假如要采纳QVariant,就非得运用Q_DECLARE_METATYPE注册。

struct ItemData{
    QString name;
    QString tel;
};

Q_DECLARE_METATYPE(ItemData)

自家是用的QSS去的写样式,这里用了贰个命名函数:m_pMicrophoneCombox->setObjectName("DeviceCombox");

 

单纯性数据存取

//存
Item->setData(itemStatus,Qt::UserRole);  // 单一存取

//取
ItemStatus status = (ItemStatus)(index.data(Qt::UserRole).toInt());

纵然是用的setstylesheet直接在代码里去写就好了。

  1. #include <QtGui/QApplication>  
  2. #include <QTableWidget>  
  3. #include <QTableWidgetItem>  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     QTableWidget *tableWidget = new QTableWidget(10,5); // 构造了二个QTableWidget的靶子,並且安装为10行,5列  
  9.     //    也可用下边包车型客车秘诀协会QTableWidget对象  
  10.     //    QTableWidget *tableWidget = new QTableWidget;  
  11.     //    tableWidget->setRowCount(10);     //设置行数为10  
  12.     //    tableWidget->setColumnCount(5);   //设置列数为5  
  13.     tableWidget->setWindowTitle("QTableWidget & Item");  
  14.     tableWidget->resize(350, 200);  //设置表格  
  15.     QStringList header;  
  16.     header<<"Month"<<"Description";  
  17.     tableWidget->setHorizontalHeaderLabels(header);  
  18.     tableWidget->setItem(0,0,new QTableWidgetItem("Jan"));  
  19.     tableWidget->setItem(1,0,new QTableWidgetItem("Feb"));  
  20.     tableWidget->setItem(2,0,new QTableWidgetItem("Mar"));  
  21.   
  22.     tableWidget->setItem(0,1,new QTableWidgetItem(QIcon("images/IED.png"), "Jan's month"));  
  23.     tableWidget->setItem(1,1,new QTableWidgetItem(QIcon("images/IED.png"), "Feb's month"));  
  24.     tableWidget->setItem(2,1,new QTableWidgetItem(QIcon("images/IED.png"), "Mar's month"));  
  25.     tableWidget->show();  
  26.   
  27.     return a.exec();  
  28. }  

结构体数据存取

//存
Item->setData(QVariant::fromValue(itemData),Qt::UserRole+1);//整体存取

//取
QVariant variant = index.data(Qt::UserRole+1);
ItemData data = variant.value<ItemData>();

上边说多少个属性函数:

澳门博发娱乐官网 1

自定义delegate

模型的互相和制图通过自定义delegate来促成,暂且没用到交互,先说下item的绘图。承继了QStyledItemDelegate后,重写paint函数管理item的体制,以及sizeHint函数再次回到item的深浅:

m_pMicrophoneCombox->setMaxVisibleItems(2);//最大可知区域为突显两条。

 

绘制item

void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{


    if(index.isValid())
    {
        painter->save();

        ItemStatus status = (ItemStatus)(index.data(Qt::UserRole).toInt());

        QVariant variant = index.data(Qt::UserRole+1);
        ItemData data = variant.value<ItemData>();

        QStyleOptionViewItem viewOption(option);//用来在视图中画一个item

        QRectF rect;
        rect.setX(option.rect.x());
        rect.setY(option.rect.y());
        rect.setWidth( option.rect.width()-1);
        rect.setHeight(option.rect.height()-1);

        //QPainterPath画圆角矩形
        const qreal radius = 7;
        QPainterPath path;
        path.moveTo(rect.topRight() - QPointF(radius, 0));
        path.lineTo(rect.topLeft() + QPointF(radius, 0));
        path.quadTo(rect.topLeft(), rect.topLeft() + QPointF(0, radius));
        path.lineTo(rect.bottomLeft() + QPointF(0, -radius));
        path.quadTo(rect.bottomLeft(), rect.bottomLeft() + QPointF(radius, 0));
        path.lineTo(rect.bottomRight() - QPointF(radius, 0));
        path.quadTo(rect.bottomRight(), rect.bottomRight() + QPointF(0, -radius));
        path.lineTo(rect.topRight() + QPointF(0, radius));
        path.quadTo(rect.topRight(), rect.topRight() + QPointF(-radius, -0));

        if(option.state.testFlag(QStyle::State_Selected))
        {
            painter->setPen(QPen(Qt::blue));
            painter->setBrush(QColor(229, 241, 255));
            painter->drawPath(path);
        }
        else if(option.state.testFlag(QStyle::State_MouseOver))
        {
            painter->setPen(QPen(Qt::green));
            painter->setBrush(Qt::NoBrush);
            painter->drawPath(path);
        }
        else{
            painter->setPen(QPen(Qt::gray));
            painter->setBrush(Qt::NoBrush);
            painter->drawPath(path);
        }

        //绘制数据位置
        QRect NameRect = QRect(rect.left() +10, rect.top()+10, rect.width()-30, 20);
        QRect circle = QRect(NameRect.right(), rect.top()+10, 10, 10);
        QRect telRect = QRect(rect.left() +10, rect.bottom()-25, rect.width()-10, 20);


        switch (status) {
        case S_RED:
            painter->setBrush(Qt::red);
            painter->setPen(QPen(Qt::red));
            break;
        case S_BLUE:
            painter->setBrush(Qt::blue);
            painter->setPen(QPen(Qt::blue));
            break;
        case S_YELLOW:
            painter->setBrush(Qt::yellow);
            painter->setPen(QPen(Qt::yellow));
            break;
        }

        painter->drawEllipse(circle);     //画圆圈

        painter->setPen(QPen(Qt::black));
        painter->setFont(QFont("Times", 12, QFont::Bold));
        painter->drawText(NameRect,Qt::AlignLeft,data.name); //绘制名字

        painter->setPen(QPen(Qt::gray));
        painter->setFont(QFont("Times", 10));
        painter->drawText(telRect,Qt::AlignLeft,data.tel); //绘制电话

        painter->restore();
    }
}

QSize ItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    return QSize(160, 60);
}

m_pMicrophoneCombox->setEditable(false); //设置QComboBox可编辑。

一. 对QTableWidget本身的功能落到实处

安装item分化景况下的体裁

在paint函数中,还足以获取当前item的情状,并安装分歧的体裁:

 if(option.state.testFlag(QStyle::State_Selected)) //选中状态
        {
            painter->setPen(QPen(Qt::blue));
            painter->setBrush(QColor(229, 241, 255));
            painter->drawPath(path);
        }
        else if(option.state.testFlag(QStyle::State_MouseOver))//鼠标划过状态
        {
            painter->setPen(QPen(Qt::green));
            painter->setBrush(Qt::NoBrush);
            painter->drawPath(path);
        }
        else{
            painter->setPen(QPen(Qt::gray));
            painter->setBrush(Qt::NoBrush);
            painter->drawPath(path);
        }

设置好模型后,再对QListView举行下属性设置:

    ui->listView->setItemDelegate(m_delegate);       //为视图设置委托
    ui->listView->setSpacing(15);                   //为视图设置控件间距
    ui->listView->setModel(m_model);                  //为委托设置模型
    ui->listView->setViewMode(QListView::IconMode); //设置Item图标显示
    ui->listView->setDragEnabled(false); 

模型的数额和突显都管理好后,运转效果如下:

listview展示

m_pMicrophoneCombox->setFocusPolicy(Qt::NoFocus);//设置QCombox未有规范。

  1. 将表格形成禁绝编辑

过滤item

Qt中提供了三个惠及管理模型排序和过滤的类QSortFilterProxyModel,通过他能够丰盛便利的拍卖大家的model。将QListView显示的model设置成代理模型:

    ui->listView->setItemDelegate(m_delegate);       //为视图设置委托
    ui->listView->setSpacing(15);                   //为视图设置控件间距
    m_proxyModel = new QSortFilterProxyModel(ui->listView);
    m_proxyModel->setSourceModel(m_model);
    m_proxyModel->setFilterRole(Qt::UserRole);
    m_proxyModel->setDynamicSortFilter(true);
    ui->listView->setModel(m_proxyModel);                  //为委托设置模型
    ui->listView->setViewMode(QListView::IconMode); //设置Item图标显示
    ui->listView->setDragEnabled(false);            //控件不允许拖动

其中,m_proxyModel->setFilterRole(Qt::UserRole);设置根据模型的某一项数据来拍卖模型的过滤。proxyModel能够设置过滤的方法,依照QString恐怕正则表达式来过滤:

m_proxyModel->setFilterFixedString(QString::number(S_RED));//根据字符串过滤
m_proxyModel->setFilterRegExp(QRegExp("^[0|2]$")); //根据正则表达式过滤

过滤模型

m_pMicrophoneCombox->setLineEdit(edit);//edit是二个lineedit,便是说QCombox的LineEdit可以自定义,而QT的源码中,顶部也是三个LineEdit。

在默许情状下,表格里的字符是足以变动的,比方双击四个单元格,就能够修改原本的内容,假设想禁绝客户的这种操作,让那么些表格对客户只读,能够如此:

赢得选中item

对于列表中item的操作,可以是在delegate中拍卖相互事件,也得以经过QListView获取到独具入选item的QModelIndex,然后对模型本身实行改造。这里小编选用的后任:

QModelIndexList modelIndexList = ui->listView->selectionModel()->selectedIndexes();

m_pMicrophoneCombox->setCurrentIndex(0); // 设置当前当选的目录。

 tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

安装多选

将QListView的selectionBehavior设置成MultiSelection即可。

对此多选的时候,模型的修改有贰个坑。在装置了代理模型后,由于开启了动态排序情势,尽管改变代理模型的数量,在率先个item修改数据后也许就不在当前过滤模型中,会被过滤掉,后面的item的QModelIndex就能变动,导致后续的修改失利。

dynamicSortFilter : bool
This property holds whether the proxy model is dynamically sorted and filtered whenever the contents of the source model change.
Note that you should not update the source model through the proxy model when dynamicSortFilter is true. For instance, if you set the proxy model on a QComboBox, then using functions that update the model, e.g., addItem(), will not work as expected. An alternative is to set dynamicSortFilter to false and call sort() after adding items to the QComboBox.
The default value is true.

有五个措施管理那几个坑,一是不更改代理模型,修改源模型的数量。二是在修改模型数据的时候关闭代理模型的动态排序成效。

m_pMicrophoneCombox->setCurrentText(TR_TALK_DEVICE_COMBOX);//设置QCombox当前的来得text,作者是用宏封装的,满足前期修改。

 

修改数据

QModelIndexList sourceIndexList;
    foreach (QModelIndex modelIndex, modelIndexList){
        sourceIndexList<<m_proxyModel->mapToSource(modelIndex); //获取源model的modelIndex
    }

//    g_proxyModel->setDynamicSortFilter(false);
    foreach (QModelIndex sourceIndex, sourceIndexList){
        ItemStatus status = (ItemStatus)(sourceIndex.data(Qt::UserRole).toInt());
        qDebug() << "Index : " << sourceIndex.row();

        switch (status) {
            case S_RED:
                redNum--;
                break;
            case S_BLUE:
                blueNum--;
                break;
            case S_YELLOW:
                yellowNum--;
                break;
        }

        status = S_RED;
        redNum++;

        m_model->setData(sourceIndex,status,Qt::UserRole);
    }
//    g_proxyModel->setDynamicSortFilter(true);

弄完大约是酱紫的:

说起底效果

Demo在这里:->Github链接地址。

m_pMicrophoneCombox->setItemData(i, list[i]);//QCombox也足以和煦传入三个链表,并且自个儿定义索引,当然,你想传一条数据,而且本人定义索引。

QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚举中的三个,都以触发修改单元格内容的标准化:

QListWidget* pListWidget = new QListWidget();//new一个widget的实例。

 

m_pMicrophoneCombox->setModel(pListWidget->model());//塞进widget的model。
m_pMicrophoneCombox->setView(pListWidget);//将widget装进Combox。

QAbstractItemView.NoEditTriggers

0

No editing possible. 不能对表格内容进行修改

QAbstractItemView.CurrentChanged

1

Editing start whenever current item changes.任何时候都能对单元格修改

QAbstractItemView.DoubleClicked

2

Editing starts when an item is double clicked.双击单元格

QAbstractItemView.SelectedClicked

4

Editing starts when clicking on an already selected item.单击已选中的内容

QAbstractItemView.EditKeyPressed

8

Editing starts when the platform edit key has been pressed over an item.

QAbstractItemView.AnyKeyPressed

16

Editing starts when any key is pressed over an item.按下任意键就能修改

QAbstractItemView.AllEditTriggers

31

Editing starts for all above actions.以上条件全包括

m_pMicrophoneCombox->count();//用来测算combox下拉窗体的分寸。

 

m_pMicrophoneCombox->addItems(list);//插入多个列表。

 

m_pMicrophoneCombox->addItem("111");//插入单条数据。

  1. 设置表格为整行选拔

以上函数基本满意专门的职业供给,若是交互的体制比较复杂,供给自定义样式,那样的话,我们就要团结去写每贰个item的体制。

tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);  //整行选中的格局

剖判下QCombox的源码,其实她的达成正是一个LineEdit和多少个ListWidget,知道啊那些就能够团结去重新写二个ListWidget。

QAbstractItemView.SelectionBehavior枚举还应该有如下类型

Item *pItem = new Item(); //item是和煦自定义写的布局,每一个item的自定义样式就足以写在那么些里面。
QListWidgetItem *pListWidgetItem = new QListWidgetItem(list[i],pListWidget);//作者是将链表的数目塞进QCombox里。
pItem->setItemData(list[i]);//给每一个item塞进多少
pListWidget->setItemWidget(pListWidgetItem, pItem);//关于那个函数作者的接头是:在底下一层下面再覆盖一层。

 

下一场在QSS的体裁里写hover、pressed鼠标事件,就有鼠标的并行。

Constant

Value

Description

QAbstractItemView.SelectItems

0

Selecting single items.选中单个单元格

QAbstractItemView.SelectRows

1

Selecting only rows.选中一行

QAbstractItemView.SelectColumns

2

Selecting only columns.选中一列

这种措施固然平价,可是多少不与UI分离,都搅在一团。

 

最好的方案正是:

 

本文由胜博发-操作发布,转载请注明来源:其实写UI是很简单的澳门博发娱乐官网,其实写