找回密码
 立即注册
Qt开源社区 门户 查看内容

QT软件开发-第7章 容器与条目控件 7.1-7.5

2019-4-21 10:13| 发布者: admin| 查看: 1726| 评论: 0

摘要: 点击上方蓝字关注我们7.1 QGroupBox组合框QGroupBox窗口部件提供了一个带标题的组合框。组合框提供一个框架、一个标题和一个键盘快捷键,并且在组合框里可以显示其它不同的窗口部件,通常作为容器部件来使用。标题在 ...


点击上方蓝字关注我们




7.1 QGroupBox组合框


QGroupBox窗口部件提供了一个带标题的组合框。组合框提供一个框架、一个标题和一个键盘快捷键,并且在组合框里可以显示其它不同的窗口部件,通常作为容器部件来使用。标题在组合框的最上面,其位置可以设置为靠左、居中、靠右、自动调整这几种方式,键盘快捷键用于移动键盘焦点到组合框的一个子窗口部件上。通常组合框作为父对象使用,将需要放组合框的控件先加入到一个布局管理器中,然后通过setLayout ()函数将布局器设置到组合框。在UI设计师里容器列表中有QGroupBox组合框控件,可以直接拖出来使用。


 图7-1-1 UI设计界面的组合框控件

7.1.1 创建组合框示例


以下通过代码方式演示组合框的创建步骤,通过布局器将需要加入的控件进行包装,最终设置给组合框。

#include <QApplication>

#include <QGroupBox>

#include <QVBoxLayout>

#include <QRadioButton>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    //创建QGroupBox组合框

    QGroupBox *groupBox = new QGroupBox(QObject::tr("性别选择"));

    //创建需要添加到组合框的窗口部件

    QRadioButton *radio1 = new QRadioButton(QObject::tr("男"));

    QRadioButton *radio2 = new QRadioButton(QObject::tr("女"));

    radio1->setChecked(true);

    //创建布局器

    QVBoxLayout *vbox = new QVBoxLayout;

    //添加窗口部件到布局器

    vbox->addWidget(radio1);

    vbox->addWidget(radio2);

    vbox->addStretch(1);

    //设置布局器到组合框

    groupBox->setLayout(vbox);

    groupBox->show();

    return a.exec();

}

效果图如下:



图7-1-2 组合框创建效果

7.1.2 函数介绍


QGroupBox组合框继承于QWidget类,主要用到的是设置布局的函数。

    1. 构造QGroupBox组合框

QGroupBox(QWidget *parent = Q_NULLPTR)

QGroupBox(const QString &title, QWidget *parent = Q_NULLPTR)

第二个构造函数可以直接设置组框的标题,后面也可以通过setTitle函数进行设置标题。

    2. 设置标题栏的对齐方式

Qt::Alignment alignment() const

void setAlignment(int alignment)

Qt::AlignLeft

左对齐

Qt::AlignRight

右对齐

Qt::AlignHCenter

居中对齐

Qt::AlignJustify

自动对齐

    3. 设置布局器

void QWidget::setLayout(QLayout *layout)  //设置布局

QLayout *QWidget::layout() const //获取布局

示例:

QVBoxLayout *layout = new QVBoxLayout;

layout->addWidget(formWidget);

setLayout(layout);

7.2 QToolBox抽屉式选项框


QToolBox类提供了一个列表式的选项卡窗口,类似于QQ的分组框。QToolBox底层的基类是QWidget,每一个页面都可以添加其他窗口控件或者设置布局器。


 图7-2-1 UI设计师界面的QToolBox类

7.2.1 创建QToolBox示例


下面使用代码方式创建QToolBox,实现QQ分组框的下拉列表效果。通过这个例子学习QToolBox的创建过程。(配套程序编号CH7-1)

    1. widget.h文件中定义了一个Widget类继承于QToolBox。

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QToolBox>

#include <QToolButton>

class Widget : public QToolBox

{

  Q_OBJECT

public:

  explicit Widget(QWidget *parent = 0);

  ~Widget();

private:

  /*定义工具按钮*/

  QToolButton *QToolButton1_1;

  QToolButton *QToolButton1_2;

  QToolButton *QToolButton2_1;

  QToolButton *QToolButton2_2;

  QToolButton *QToolButton3_1;

  QToolButton *QToolButton3_2;

};

#endif // WIDGET_H

    2. widget.cpp文件中编写了QToolBox主要代码。

#include "widget.h"

#include "ui_widget.h"

#include <QGroupBox>

Widget::Widget(QWidget *parent) :

  QToolBox(parent)

{

  setWindowTitle(tr("QQ"));

  /***************初始化我的好友******************/

  QToolButton1_1=new QToolButton;

  QToolButton1_1->setText(tr("陈工")); //设置按钮显示的文本

  QToolButton1_1->setIcon(QPixmap(":/images/1.png")); //设置按钮显示的图标

  QToolButton1_1->setIconSize(QPixmap(":/images/1.png").size()); //设置图标的大小

  QToolButton1_1->setAutoRaise(true); //设置自动提高

  QToolButton1_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); //设置文本和字体显示的样式

  QToolButton1_2=new QToolButton;

  QToolButton1_2->setText(tr("牛工"));

  QToolButton1_2->setIcon(QPixmap(":/images/2.png"));

  QToolButton1_2->setIconSize(QPixmap(":/images/2.png").size());

  QToolButton1_2->setAutoRaise(true);

  QToolButton1_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

  /***************添加"好友"列表成员******************/

  QGroupBox *groupBox1=new QGroupBox;

  QVBoxLayout *layout1=new QVBoxLayout(groupBox1);

  layout1->setMargin(10);

  layout1->setAlignment(Qt::AlignHCenter);

  layout1->addWidget(QToolButton1_1);

  layout1->addWidget(QToolButton1_2);

  layout1->addStretch();

  /***************陌生人**********************/

  QToolButton2_1=new QToolButton;

  QToolButton2_1->setText(tr("小覃"));

  QToolButton2_1->setIcon(QPixmap(":/images/3.png"));

  QToolButton2_1->setIconSize(QPixmap(":/images/3.png").size());

  QToolButton2_1->setAutoRaise(true);

  QToolButton2_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

  QToolButton2_2=new QToolButton;

  QToolButton2_2->setText(tr("小丽"));

  QToolButton2_2->setIcon(QPixmap(":/images/4.png"));

  QToolButton2_2->setIconSize(QPixmap(":/images/4.png").size());

  QToolButton2_2->setAutoRaise(true);

  QToolButton2_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

  /***************添加陌生人列表成员******************/

  QGroupBox *groupBox2=new QGroupBox;

  QVBoxLayout *layout2=new QVBoxLayout(groupBox2);

  layout2->setMargin(10);

  layout2->setAlignment(Qt::AlignHCenter);

  layout2->addWidget(QToolButton2_1);

  layout2->addWidget(QToolButton2_2);

  layout2->addStretch();

  /***************黑名单*********************/

  QToolButton3_1=new QToolButton;

  QToolButton3_1->setText(tr("小明"));

  QToolButton3_1->setIcon(QPixmap(":/images/5.png"));

  QToolButton3_1->setIconSize(QPixmap(":/images/5.png").size());

  QToolButton3_1->setAutoRaise(true);

  QToolButton3_1->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

  QToolButton3_2=new QToolButton;

  QToolButton3_2->setText(tr("小王"));

  QToolButton3_2->setIcon(QPixmap(":/images/6.png"));

  QToolButton3_2->setIconSize(QPixmap(":/images/6.png").size());

  QToolButton3_2->setAutoRaise(true);

  QToolButton3_2->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

  /***************添加黑名单列表成员*****************/

  QGroupBox *groupBox3=new QGroupBox;

  QVBoxLayout *layout3=new QVBoxLayout(groupBox3);

  layout3->setMargin(10);

  layout3->setAlignment(Qt::AlignHCenter);

  layout3->addWidget(QToolButton3_1);

  layout3->addWidget(QToolButton3_2);

  layout3->addStretch();

  /***************将添加QGroupBox窗口到QToolBox窗口******************/

  this->addItem((QWidget*)groupBox1,tr("我的好友"));

  this->addItem((QWidget*)groupBox2,tr("陌生人"));

  this->addItem((QWidget*)groupBox3,tr("黑名单"));

}

Widget::~Widget()

{

}

    3. main.cpp文件代码

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    Widget w;

    w.show();

    return a.exec();

}

    4. 运行效果图



 图7-2-2 运行效果图

7.2.2 函数介绍


    1. 添加新的标签页

int addItem(QWidget *widget, const QIcon &iconSet, const QString &text)

int addItem(QWidget *w, const QString &text)

addItem函数用于在新标签页中添加其他窗口控件,新加入的标签页将放在标签列表的底部。添加成功后返回新标签页的索引值,索引值默认从0开始计算。addItem是一个重载的函数,第一个函数可以设置标签页的图标。

用法示例:

this->addItem((QWidget*)groupBox1,QIcon(":/images/6.png"),tr("我的好友"));

this->addItem((QWidget*)groupBox2,tr("陌生人"));

this->addItem((QWidget*)groupBox3,tr("黑名单"));

    2. 插入新的标签页

int insertItem(int index, QWidget *widget, const QString &text);

int insertItem(int index, QWidget *widget, const QIcon &icon, const QString &text);

insertItem函数用于将窗口部件插入到索引值对应的位置。如果索引值超出范围,将默认添加到标签列表的底部。

    3. 卸载标签页

void QToolBox::removeItem(int index)

removeItem函数用于卸载指定的标签页,删除后标签页将会消失。但是不会删除标签页中的控件。

    4. 获取标签页的数量

int count() const

    5. 获取已经加入的窗口部件索引值

int indexOf(QWidget *widget) const;

示例:indexOf((QWidget*)groupBox1);  //得到groupBox1控件所在页面的索引值。

    6. 根据索引值显示对应的标签页

int currentIndex() const //获取当前标签页的索引值。

void setCurrentIndex(int index) //根据标签页的索引值,显示出指定页面。

索引值在调用addItem函数添加新的标签页时会返回,索引值都是从0开始计算。setCurrentIndex函数相当于指定当前显示的标签页面,根据填入的索引值显示出索引值对应的标签页。当标签页的索引值发生改变时会发出currentChanged信号,根据currentChanged信号就可以得知当前展现出来的是那一个标签页。

用法示例:

this->setCurrentIndex(1); //当前显示第1个标签页

this->setCurrentIndex(0); //当前显示第0个标签页

this->setCurrentIndex(2); //当前显示第2个标签页

    7. 根据已经加入的窗口部件显示对应的标签页

void QToolBox::setCurrentWidget(QWidget *widget)

QWidget *QToolBox::currentWidget() const

这两个函数与setCurrentIndex类似,根据已经加入的控件定位显示对应的标签页。

示例:

this->setCurrentWidget((QWidget*)groupBox3); //显示groupBox3控件所在的标签页

this->setCurrentWidget((QWidget*)groupBox1);//显示groupBox1控件所在的标签页

    8. 设置标签页的状态

void QToolBox::setItemEnabled(int index, booenabled) //根据索引值设置对应标签页的状态

booQToolBox::isItemEnabled(int index) const //判断索引值对应的标签页是否可用

如果通过setItemEnabled函数设置了对应标签页的状态为false,该标签页就处于禁用状态,用户无法点击。

    9. 设置标签页的标题

void setItemText(int index, const QString &text); //设置对应标签页的标题

QString itemText(int index) const; //获取标签页的标题



图7-2-3 运行效果图

    10. 设置标签页的图标

void setItemIcon(int index, const QIcon &icon);

QIcon itemIcon(int index) const;

7.3 QScrollArea滚动视图


QScrollArea 能够为 widget(或其子类)添加滚动视图 。滚动视图可以在widget的尺寸超过整个框架的尺寸时,显示滚动条,显示滚动条之后子窗口的整个内容,都可以被用户看到。这个子窗口使用setWidget()函数指定。


 图 7-3-1 继承关系

7.3.1 QscrollArea滚动视图显示图片示例


以下代码在QScrollArea滚动视图中添加QLabel标签,QLabel标签上显示了一张图片。当图片的尺寸大于窗口的尺寸时,QScrollArea滚动视图会自动显示滚动条。当图片尺寸小于窗口尺寸时,滚动条会自动消失。

#include "widget.h"

#include <QApplication>

#include <QLabel>

#include <QScrollArea>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    QLabe*imageLabe= new QLabel; //创建标签

    QImage image("E:/splash.bmp"); //加载图片

    imageLabel->setPixmap(QPixmap::fromImage(image)); //设置显示的图片

    QScrollArea *scrollArea = new QScrollArea; //新建滚动视图类

    scrollArea->setBackgroundRole(QPalette::Dark);

    scrollArea->setWidget(imageLabel); //指定显示的窗口控件

    scrollArea->show(); //显示

    return a.exec();

}





 图7-3-2 图片显示效果

7.3.2 函数介绍


    1. 设置QScrollArea显示的窗口

QWidget *widget() const;

void setWidget(QWidget *widget);

如果想要向QScrollArea添加复杂的视图,可以先new一个QWidget,然后将需要显示的窗口部件添加到布局器中,再将布局器设置给QWidget,最后将QWidget设置给QScrollArea显示。

示例:

#include "widget.h"

#include <QApplication>

#include <QSpinBox>

#include <QScrollArea>

#include <QDebug>

#include <QLineEdit>

#include <QFormLayout>

int main(int argc, char *argv[])

{

  QApplication a(argc, argv);

  QScrollArea *scrollArea = new QScrollArea; //新建滚动视图类

  QWidget *widget=new QWidget;

  QLineEdit *nameLineEdit=new QLineEdit;

  QLineEdit *emailLineEdit=new QLineEdit;

  QSpinBox *ageSpinBox=new QSpinBox;

  QFormLayout *formLayout = new QFormLayout;

  formLayout->addRow(QObject::tr("&姓名:"), nameLineEdit);

  formLayout->addRow(QObject::tr("&邮箱:"), emailLineEdit);

  formLayout->addRow(QObject::tr("&年龄:"), ageSpinBox);

  widget->setLayout(formLayout);

  scrollArea->setBackgroundRole(QPalette::Window);

  scrollArea->setWidget(widget); //指定显示的控件

  scrollArea->show(); //显示

  scrollArea->setWindowTitle("滚动视图");

  scrollArea->setWidgetResizable(true);

  return a.exec();

}



 图7-3-3 滚动视图显示效果

    2. 自动调整视图显示区域

boowidgetResizable() const;

void setWidgetResizable(booresizable);

setWidgetResizable(true) 表示由QScrollArea自动管理视图显示大小。

    3. 调整视图的对齐方式

Qt::Alignment alignment() const

void setAlignment(Qt::Alignment)

对齐方式枚举值:

Qt::AlignLeft

左对齐

Qt::AlignHCenter

水平居中

Qt::AlignRight

右对齐

Qt::AlignTop   

顶部

Qt::AlignVCenter

垂直对齐

Qt::AlignBottom

底部

注意:如果设置了自动调整视图的属性,以上的对齐方式将会失去作用。

    4. 指定背景色

void QWidget::setBackgroundRole(QPalette::ColorRole role)

没有显示控件的其他区域将使用设置的背景色进行填充。默认情况下设置为QPalette::Window 。

7.3.3 图行方式放置QScrollArea滚动视图


QScrollArea滚动视图在UI设计师界面的容器类有对应的控件,可以直接拖出来进行使用。下面展示QScrollArea滚动视图控件用法。









 图7-3-4 滚动视图显示效果

7.4 QtabWidget多页面切换视图


QTabWidget类提供了一个选项卡式窗口,类似于浏览器的标签页。用户可以点击选项卡或者使用快捷键进行切换不同的页面。

使用QTabWidget的操作步骤如下:

1. 创建一个QTabWidget。

2. 创建需要加入到QTabWidget中的窗口控件。

3. 给创建的窗口控件设置布局器。

4. 调用addTab()或insertTab()函数将创建的窗口控件添加到QTabWidget合适的标签页。

7.4.1 创建QTabWidget示例


(配套程序编号CH7-2)

#include <QApplication>

#include <QTabWidget>

#include <QLineEdit>

#include <QSpinBox>

#include <QFormLayout>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

/*创建tabwidget窗口*/

QTabWidget *tabwidget=new QTabWidget;

/*新建第1个页面*/

QWidget *widget1=new QWidget;

QLineEdit *nameLineEdit=new QLineEdit;

QFormLayout *formLayout1 = new QFormLayout;

formLayout1->addRow(QObject::tr("&姓名:"), nameLineEdit);

widget1->setLayout(formLayout1);

tabwidget->addTab(widget1,"标签页面1");

/*新建第2个页面*/

QWidget *widget2=new QWidget;

QLineEdit *emailLineEdit=new QLineEdit;

QSpinBox *ageSpinBox=new QSpinBox;

QFormLayout *formLayout2 = new QFormLayout;

formLayout2->addRow(QObject::tr("&邮箱:"), emailLineEdit);

widget2->setLayout(formLayout2);

tabwidget->addTab(widget2,"标签页面2");

/*新建第3个页面*/

QWidget *widget3=new QWidget;

QFormLayout *formLayout3 = new QFormLayout;

formLayout3->addRow(QObject::tr("&年龄:"), ageSpinBox);

widget3->setLayout(formLayout3);

tabwidget->addTab(widget3,"标签页面3");

/*显示tabwidget页面*/

tabwidget->show();

return a.exec();

}





 图7-4-1 QTabWidget视图效果

7.4.2 函数介绍


    1. 添加新的标签页

int addTab(QWidget *widget, const QString &);

int addTab(QWidget *widget, const QIcon& icon, const QString &label);

addTab函数用于添加新的标签页,可以指定选项卡的图标和标签名称。添加成功后返回标签页的索引值。

    2. 插入新的标签页

int insertTab(int index, QWidget *widget, const QString &);

int insertTab(int index, QWidget *widget, const QIcon& icon, const QString &label);

insertTab函数用于插入新的标签页,可以通过index参数指定插入的位置。如果index值超出了范围,将默认添加到最后面。可以通过count()函数获取标签页的总数量。

    3. 卸载标签页

void removeTab(int index);

根据标签页的索引值卸载指定标签页。注意:removeTab不会卸载标签页中包含的控件。

    4. 设置标签页的可用性

booisTabEnabled(int index) const;

void setTabEnabled(int index, bool);

示例:tabwidget->setTabEnabled(0,false);  禁止使用索引值为0的标签页,设置false后标签页将会呈灰色状态,无法点击。

    5. 设置标签页选项卡显示的文本

QString tabText(int index) const;

void setTabText(int index, const QString &);

Index索引值是添加新页面时函数返回的值,代表标签页的位置。

    6. 设置标签页选项卡显示的图标

QIcon tabIcon(int index) const;

void setTabIcon(int index, const QIcon & icon);

Index索引值是添加新页面时函数返回的值,代表标签页的位置。

    7. 设置当前显示的标签页

int currentIndex() const

void setCurrentIndex(int index)

void QTabWidget::setCurrentWidget(QWidget *widget)

QWidget *currentWidget() const;

第一组函数通过标签页的索引值进行设置当前显示的标签页。第二组函数通过已经添加到标签页面的窗口控件进行设置当前显示的标签页。

示例:tabwidget->setCurrentIndex(2); //设置当前显示的页面为第3组标签页。标签页的索引值从0开始计算。

当却换标签页时会发出”void currentChanged(int index)”信号,可以通过该信号的形参获取当前显示的标签页。

    8. 设置标签页的显示样式

TabPosition tabPosition() const;

void setTabPosition(TabPosition);

TabPosition枚举值如下:

QTabWidget::North

选项卡显示在标签页上方

QTabWidget::South

选项卡显示在标签页下方

QTabWidget::West

选项卡显示在标签页左方

QTabWidget::East

选项卡显示在标签页右方









 图7-4-2 选项卡样式设置

    9. 设置选项卡自动显示关闭按钮

bootabsClosable() const

void setTabsClosable(boocloseable)

tabwidget->setTabsClosable(true);设置closeable属性为true后,选项卡上将会显示一个关闭图标。

显示关闭按钮后的效果图如下:



默认情况下关闭按钮不响应关闭事件。需要自己添加函数卸载对应的标签页。

关闭标签页发出的信号为:void tabCloseRequested(int index);

卸载标签页的函数:void removeTab(int index);

卸载标签页的函数是一个普通成员函数,不是槽函数,不可以直接与信号相连,我们需要自己手动定义个接受 int类型的槽函数,然后把参数再传递给removeTab关闭函数进行关闭标签页。

    10. 设置标签页选项卡的可移动属性

booisMovable() const

void setMovable(boomovable)

默认movable属性为false,当设置movable为true后,鼠标可以移动标签页的位置。

    11. 设置标签文本显示的模式

Qt::TextElideMode elideMode() const;

void setElideMode(Qt::TextElideMode);

文本显示模式枚举值如下:

Qt::ElideLeft、Qt::ElideRight、Qt::ElideMiddle、Qt::ElideNone。

    12. 设置标签显示的图标大小

QSize iconSize() const;

void setIconSize(const QSize &size);

    13. 设置标签页支持显示滚动条属性

boousesScrollButtons() const

void setUsesScrollButtons(boouseButtons)

当标签页的内容太大无法完全显示的时候,会自动出现滚动条。

    14. 常用的信号

void currentChanged(int index);  //标签页切换时发出。形参表示新页面的索引值。

void tabCloseRequested(int index); //点击选项卡的关闭按钮时发出。形参表示需要关闭页面的索引值。

void tabBarClicked(int index);    //用户单击选项卡时发出。形参表示单击的选项卡页面索引值。

void tabBarDoubleClicked(int index); //用户双击选项卡时发出。形参表示双击的选项卡页面索引值。

7.4.3 图像方式放置QTabWidget


QTabWidget视图控件在UI设计师界面的容器类有对应的控件,可以直接拖出来进行使用。下面展示QTabWidget多页面切换视图控件的用法。





 图7-4-3 图像方式放置QTabWidget

7.5 listWidget列表控件


QListWidget类是一个基于项目列表的控件,可以在项目界面添加和删除条目。QListWidget的基类是 QListView 视图类,QListWidget使用一个内部的模型管理列表中的每个QListWidgetItem。如果需要一个更灵活的列表视图部件,可以使用QListView类标准视图模型。在 UI设计界面左边的控件工具栏可以看到三个基于条目的控件。QListWidget(列表控件)、QTreeWidget(树形控件)和QTableWidget(表格)都是将模型和视图结合起来的方便类。



 图7-5-1 UI设计界面的条目控件组

7.5.1 创建条目列表示例


#include <QApplication>

#include <QTabWidget>

#include <QLineEdit>

#include <QSpinBox>

#include <QFormLayout>

#include <QListWidget>

#include <QLabel>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

/*创建QListWidget*/

QListWidget *listWidget = new QListWidget;

/*添加条目*/

listWidget->addItem(new QListWidgetItem(QIcon(QObject::tr(":/image/0.ico")), QObject::tr("条目1")));

listWidget->addItem(new QListWidgetItem(QIcon(QObject::tr(":/image/1.ico")), QObject::tr("条目2")));

listWidget->addItem(new QListWidgetItem(QIcon(QObject::tr(":/image/2.ico")), QObject::tr("条目3")));

/*创建布局器*/

QHBoxLayout *layout = new QHBoxLayout;

layout->addWidget(listWidget);

/*创建QWidget*/

QWidget *widget = new QWidget;

widget->setLayout(layout);

widget->setWindowTitle(QObject::tr("QListWidget 列表控件Demo"));

widget->show();

return a.exec();

}



图 7-5-2 条目列表显示效果

7.5.2 QListWidget类函数介绍


    1. 添加单个条目控件

void addItem(const QString &label)

void addItem(QListWidgetItem *item)

addItem函数是一个重载函数,用来添加条目信息,新添加的条目接在之前条目的后面显示。第一个addItem函数直接传入直接字符串创建标,第二个函数传入QListWidgetItem指针,QListWidgetItem类是给QListWidget创建条目的视图类。

用法示例:

listWidget->addItem(QObject::tr("条目1"));

listWidget->addItem(new QListWidgetItem(QIcon(QObject::tr(":/image/0.ico")), QObject::tr("条目1")));

    2. 添加多个条目数据

void addItems(const QStringList &labels)

addItems函数传入的是一个字符串列表,可以一次性添加多个条目。添加的是单纯的字符串数据。

用法示例:

QStringList list;

list<<"条目1"<<"条目2"<<"条目3";

listWidget->addItems(list);

    3. 插入条目信息

void insertItem(int row, QListWidgetItem *item);

void insertItem(int row, const QString &label);

void insertItems(int row, const QStringList &labels);

以上3个函数与前面添加条目的函数参数对应。row属性表示插入的行位置,如果行数超出范围,默认插入最后位置。

    4. 获取条目的行数

QListWidgetItem *item(int row) const; //获取指定行的条目指针

int row(const QListWidgetItem *item) const; //根据已知的条目指针获取其所在行数。

int count() const; //获取总条目数量

    5. 删除指定条目

QListWidgetItem *takeItem(int row); //删除指定行的条目,并返回条目视图指针

takeItem只是将指定行的条目从QListWidgetItem中移除,不会删除条目视图,需要手动将条目删除掉。如果传入的行数不合法,将返回NULL指针。如果想要清空列表可以调用void QListWidget::clear()槽函数。

    6. 根据条目指针设置当前列表选中项

QListWidgetItem *currentItem() const;  //获取当前选中的条目指针

void setCurrentItem(QListWidgetItem *item); //选中包含已知的item条目选项。

void setCurrentItem(QListWidgetItem *item, QItemSelectionModel::SelectionFlags command);

最后一个函数的SelectionFlags 参数 command,决定了选中的方式、比如:QItemSelectionModel::Select 选中, QItemSelectionModel::Deselect:取消选中。

    7. 根据行号设置当前列表选中项

int currentRow() const;

void setCurrentRow(int row);

void setCurrentRow(int row, QItemSelectionModel::SelectionFlags command);

    8. 设置条目选择的模式

有些情况下需要用到多选模式,比如文件资源管理器中ctrl+鼠标点击可以选择多个文件。默认情况下QListWidgetItem是单选模式。

void setSelectionMode(QAbstractItemView::SelectionMode mode);

QAbstractItemView::SelectionMode selectionMode() const;

设置选择模式的函数继承于AbstractItemView类,AbstractItemView类是所有模型视图类抽象类。

常用模式如下:

QAbstractItemView::ExtendedSelection :多选模式。按下ctrl+鼠标点击或者拖动鼠标可以完成多选。

QAbstractItemView::MultiSelection:多选模式,按下ctrl+鼠标点击或者拖动鼠标可以完成多选,选中后单击其他区域不会取消选中,需要手动点击或者滚动鼠标取消选中状态。

QAbstractItemView::NoSelection :禁止选中

QAbstractItemView::SingleSelection :单选模式

如果设置了多选模式可以使用以下函数获取选中的条目列表:

QList<QListWidgetItem *> QListWidget::selectedItems() const

    9. 设置自动排序

void setSortingEnabled(booenable);

booisSortingEnabled() const;

列表默认不排序,可以设置enable属性为true自动排序。还可以使用sortItems手动指定排序方式:

void sortItems(Qt::SortOrder order = Qt::AscendingOrder);

Qt::AscendingOrder :升序排列,Qt::DescendingOrder :降序排列。

    10. 设置条目控件的编辑属性

在程序运行期间,如果需要编辑修改条目数据,可以调用以下相关函数启动编辑模式。

void editItem(QListWidgetItem *item);  //开始编辑指定条目控件,前提是该条目控件支持编辑

void openPersistentEditor(QListWidgetItem *item); //打开编辑器

void closePersistentEditor(QListWidgetItem *item); //关闭编辑器,结束编辑

用法示例:

listWidget->openPersistentEditor(itme);



 图 7-5-3 条目编辑属性

    11. 给指定条目添加Widget控件

QWidget *itemWidget(QListWidgetItem *item) const; //获取指定条目上的Widget控件

void setItemWidget(QListWidgetItem *item, QWidget *widget); //给指定条目添加Widget控件

inline void removeItemWidget(QListWidgetItem *item); //卸载指定条目上已经添加的Widget控件

示例:

QPushButton *Button=new QPushButton("按钮");

listWidget->setItemWidget(itme,Button);



 图 7-5-4 条目添加Widget控件

    12. 隐藏指定条目

booisItemHidden(const QListWidgetItem *item) const; //根据已知的条目指针判断它否处于隐藏状态

void setItemHidden(const QListWidgetItem *item, boohide); //设置指定条目的隐藏状态

示例:listWidget->setItemHidden(itme,true);  //设置itme条目从列表中隐藏,列表将不在显示该条目。

    13. 查找条目

QList<QListWidgetItem*> findItems(const QString &text, Qt::MatchFlags flags) const;

findItems函数第一个参数 text 是要查找的模板字符串,第二个参数是匹配标志。Qt::MatchFlags可用于字符串匹配,也可以用于其他类型变量的匹配。

Qt::MatchFlags 包含关于查找匹配的枚举值:

Qt::MatchExactly

精确匹配,执行基于 QVariant 的匹配。

Qt::MatchFixedString

执行基于字符串的匹配,如果不指定 MatchCaseSensitive,默认是大小写不敏感。

Qt::MatchContains

条目包含要查找的模板字符串。

Qt::MatchStartsWith

条目以要查找的模板字符串开头。

Qt::MatchEndsWith

条目以要查找的模板字符串结尾。

Qt::MatchCaseSensitive

查找时大小写敏感。

Qt::MatchRegExp

根据正则表达式模板字符串匹配字符串。

Qt::MatchWildcard

根据通配符模板字符串(如 *.txt)匹配字符串。

Qt::MatchWrap

执行回绕查找,当查找到最后一个条目时返回到第一个的条目继续查找,直到所有的条目都检查一遍。

Qt::MatchRecursive

递归查找,遍历所有条目。

    14. 条目滚动函数

void scrollToItem(const QListWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible);

列表控件自带滚动条,当条目总数超出控件矩形能呈现的数目时,滚动条自动出现,通过滚动条支持更多的条目显示。使用scrollToItem槽函数可以让列表控件滚动到想显示的某个条目位置。

第一个参数 item 就是想显示出来的条目,第二个参数是滚动显示的方式。

显示的方式枚举值如下:

QAbstractItemView::EnsureVisible

滚动指定条目到能显示出来的位置,只要能显示即可,位置不限。

QAbstractItemView::PositionAtTop

滚动指定条目到可视区域的顶部。

QAbstractItemView::PositionAtBottom

滚动指定条目到可视区域的底部。

QAbstractItemView::PositionAtCenter

滚动指定条目到可视区域中间。

  • 下面介绍QListWidgetItem常用的几个信号

    1. 点击条目时发出的相关信号

void itemPressed(QListWidgetItem *item); //当鼠标按下某个条目控件时发出的信号。

void itemClicked(QListWidgetItem *item); //单击某个条目控件发出的信号

void itemDoubleClicked(QListWidgetItem *item); //双击某个条目控件发出的信号

    2. 条目数据发生改变触发的信号

void itemChanged(QListWidgetItem *item); //当条目数据项发生改变时发出的信号

    3. 当前选择的条目发生改变时触发的相关信号

void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); //当前选择的条目发生变化时发出的信号。Current当前选中的条目,previous之前选中的条目。

void currentTextChanged(const QString ¤tText); //当前的条目文本发生改变时发出的信号

void currentRowChanged(int currentRow); //当前选择的条目发生变化时发出的信号。currentRow当前行号。

    4. 条目选择情况发生改变时触发的信号

void itemSelectionChanged();

只要条目选择情况发生任何变化,无论单选还是多选都会触发itemSelection信号。

7.5.3 QListWidgetItem条目视图介绍


QListWidgetItem类是一个描述QListWidget条目信息的视图类,一个QListWidgetItem代表QListWidget一个单一的条目。QListWidgetItem可以直接使用数据流QDataStream进行读写。QListWidgetItem可以设置字符串、图标、复选框等特性。

    1. 构造QListWidgetItem类

QListWidgetItem(QListWidget *parent = Q_NULLPTR, int type = Type)

QListWidgetItem(const QString &text, QListWidget *parent = Q_NULLPTR, int type = Type)

QListWidgetItem(const QIcon &icon, const QString &text, QListWidget *parent = Q_NULLPTR, int type = Type)

QListWidgetItem(const QListWidgetItem &other)

QListWidgetItem构造函数中,icon是条目显示的图标,text 是条目的文本,parent 是条目属于的列表控件,type 是条目的自定义类型。如果在构造函数指定了条目属于的列表控件,这个条目会自动添加到该列表控件的末尾。一般不建议直接指定列表控件。

示例:

QListWidget *listWidget = new QListWidget;

QListWidgetItem *itme=new QListWidgetItem(QIcon(QObject::tr(":/image/0.ico")), QObject::tr("条目1"));

listWidget->addItem(itme);

    2. 设置文本和图标

QString text() const //获取显示的文本

void setText(const QString &text); //设置条目显示的文本

QIcon icon() const //获取显示的图标

void setIcon(const QIcon &icon); //设置条目显示的图标

    3. 设置条目文本显示的字体

QFont font() const //获取字体

void setFont(const QFont &font);//设置字体

    4. 状态栏信息提示

如果主界面窗口有状态栏,鼠标悬停在该条目上时可以显示条目设置的状态信息显示到状态栏。

QString statusTip() const //获取显示到状态栏的提示文本

void setStatusTip(const QString &statusTip); //设置显示到状态栏的提示文本

    5. 设置工具提示信息

void QListWidgetItem::setToolTip(const QString &toolTip)

QString QListWidgetItem::toolTip() const

当鼠标停留在条目选项上时,会弹出提示信息。

示例:itme1->setToolTip(QObject::tr("列表条目视图"));

提示效果图如下:



     6. 设置文本的对齐方式

int textAlignment() const

void setTextAlignment(int alignment)

Qt::AlignLeft

左对齐

Qt::AlignRight

右对齐

Qt::AlignHCenter

水平居中

Qt::AlignJustify

两端对齐

    7. 设置文本显示颜色

QColor textColor() const

void setTextColor(const QColor &color)

示例:

QListWidgetItem *itme->setTextColor(QColor(255, 0, 0)); //设置文本颜色显示为红色

    8. 设置条目背景画刷

QBrush background() const

void setBackground(const QBrush &brush)

示例:

QListWidgetItem *itme->setBackground(QBrush(QColor(0, 0, 255))); //设置条目的背景画刷为蓝色

    9. 设置条目的背景画刷

QBrush foreground() const

void setForeground(const QBrush &brush)

示例:

itme3->setForeground(QBrush(QColor(0, 255,0))); ////设置条目的背景画刷为绿色

    10. 设置条目的复选框状态

Qt::CheckState checkState() const  //获取选择的状态

void setCheckState(Qt::CheckState state) //设置选择的状态

设置状态枚举如下:

Qt::Unchecked

未选中

Qt::PartiallyChecked

三态选中

Qt::Checked

选中

示例:

itme3->setCheckState(Qt::Checked);  //设置当前条目为选择状态



 图7-5-5 复选框选择状态

    11. 获取条目的类型值

int QListWidgetItem::type() const

如果需要给条目分类,可以在QListWidgetItem构造函数里填写条目的类型值。类型值就是一个整数值。

    12. 设置条目的隐藏状态

void setHidden(boohide);

booisHidden() const;

Hide属性保存了当前条目在列表中是否隐藏。

示例:itme3->setHidden(true);  //设置该条目为隐藏的状态。注意:条目需要先添加到列表之后才能设置。

    13. 高亮选中

void QListWidgetItem::setSelected(booaselect)

booQListWidgetItem::isSelected() const

设置当前条目为选中状态,选中后为高亮状态。

示例:

itme1->setSelected(true);  //选中当前条目

    14. 设置条目特性标志

Qt::ItemFlags flags();

void setFlags(Qt::ItemFlags flags);

标志枚举值如下:

Qt::NoItemFlags

不设置任何特性,条目会处于完全的不可用状态。

Qt::ItemIsSelectable

条目本身可以被高亮选中。

Qt::ItemIsEditable

条目可以被编辑,比如用户双击条目时自动启用文本编辑器。

Qt::ItemIsDragEnabled

条目可以被拖拽出去。

Qt::ItemIsDropEnabled

条目可以作为拖拽的目的地。

Qt::ItemIsUserCheckable

条目可以有复选框,用户能勾选复选框。

Qt::ItemIsEnabled

条目处于可用状态。

Qt::ItemIsTristate

条目的复选框可以有三种勾选状态:选中、非选中、部分选中。

Qt::ItemNeverHasChildren

条目不能有子条目

设置条目标志示例:

itme1->setFlags(Qt::ItemIsEnabled|Qt::ItemIsDropEnabled|Qt::ItemIsDragEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable);

列表控件条目默认支持以下4个标志:

Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled

7.5.4 创建音乐列表示例


上面介绍了listWidget常用的一些函数,本小节通过listWidget编写一个音乐列表,进一步学习listWidget的用法。音乐列表支持同时添加多个条目,支持一次删除多个条目,可以倒序、顺序排序。(配套程序编号CH7-3)

    1. UI设计界面布局



图7-5-6 UI布局界面

主窗口采用了水平布局方式,左边是一个listWidget控件,右边使用垂直布局器封装了按钮控件。

    2. widget.cpp文件

1) 构造函数代码

#include "widget.h"

#include "ui_widget.h"

#include <QFileDialog>

#include <QListWidgetItem>

#include <QString>

#include <QMessageBox>

#include <QTextStream>

#include <QDebug>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    /*设置标题*/

    this->setWindowTitle("歌曲列表");

    /*没有导入歌曲之前设置其他按钮不可用*/

    ui->pushButton_del->setEnabled(false);

    ui->pushButton_tofile->setEnabled(false);

    ui->radioButton_down->setEnabled(false);

    ui->radioButton_up->setEnabled(false);

    ui->checkBox_sorting->setEnabled(false);

    /*设置列表支持多选模式*/

    ui->listWidget->setSelectionMode(QAbstractItemView::MultiSelection);

}

Widget::~Widget()

{

    delete ui;

}

构造函数中设置了listWidget列表支持多选模式,在没有导入歌曲之前限制了其他按钮不可用。

2) 导入歌曲按钮槽函数代码

//导入歌曲文件到列表

void Widget::on_pushButton_add_clicked()

{

    /*选择需要添加的歌曲文件,可以多选*/

    QStringList files = QFileDialog::getOpenFileNames(

                            this,

                            "选择需要添加的歌曲文件",

                            "D:/",

                            "*.mp3 *.wma *.wav *.wmv");

    /*判断列表是否为空*/

    if(files.count()<=0)return;

    /*设置其他按钮状态*/

    ui->pushButton_del->setEnabled(true);

    ui->pushButton_tofile->setEnabled(true);

    ui->checkBox_sorting->setEnabled(true);

    /*添加歌曲到列表*/

    for(int i=0;i<files.count();i++)

    {

        /*创建条目*/

       QListWidgetItem *item=new QListWidgetItem;

       QFile file(files.at(i));

       if(file.open(QIODevice::ReadOnly)!=true)continue;

       QFileInfo fileinfo(file);

       /*根据歌曲的后缀显示不同的图标*/

       if(fileinfo.suffix()=="mp3")

       {

            item->setIcon(QIcon(":/images/mp3.ico"));

       }

       if(fileinfo.suffix()=="wma")

       {

            item->setIcon(QIcon(":/images/wma.ico"));

       }

       if(fileinfo.suffix()=="wav")

       {

   

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了