Qt Style Sheet实践(二):组合框QComboBox的定制
- 格式:docx
- 大小:182.55 KB
- 文档页数:5
ComboBox控件的⽤法教程前⾯我们了解了ListBox(列表框)控件的使⽤,在中还有⼀个与ListBox控件⼗分相似的控件——ComboBox 控件,也叫组合框。
组合框控件包括两个部分,⼀部分是上部可以输⼊列表项的⽂本框;另⼀部分是位于⽂本框下⽅的列表框,⽤于显⽰⽤户可以从中选择的项的列表 ComboBox 控件和ListBox 控件在功能上很相似,很多情况下,这两个控件是可以互换使⽤的,但是还是有某种特定的环境下只适合使⽤⼀种控件的情况。
通常,ComboBox控件适合于建议⽤户选择控件所列举的选项、同时⼜可以让⽤户⾃⾏在⽂本框中输⼊列表中不存在的选项的情况;⽽ListBox 控件适合于限制⽤户只能选择列表中的选项的情况。
在⽤户界⾯上,因为ComboBox 控件默认情况下是存在下拉列表框的,所以⽐ListBox 控件占⽤的窗体空间少,更加适合于使⽤在存在⼤量列表项的情况下。
如下图三所⽰的是QQ修改个⼈设置的界⾯,它⼤量地合理使⽤ComboBox 控件,使得⽤户界⾯简洁且能容纳下更多的选项信息。
由此可见,ComboBox 控件的⽐ListBox 控件更加能灵活多⽤。
⼀、ComboBox 控件的常⽤属性: 1、BackColor 属性:获取或设置ComboBox 控件的背景⾊。
2、DropDownStyle 属性:获取或设置指定组合框样式的值,确定⽤户能否在⽂本部分中输⼊新值以及列表部分是否总显⽰。
它包含三个值,默认值为 DropDown,如下表所⽰:成员名称说明DropDown ⽂本部分可编辑。
⽤户必须单击箭头按钮来显⽰列表部分。
DropDownList ⽤户不能直接编辑⽂本部分。
⽤户必须单击箭头按钮来显⽰列表部分。
Simple ⽂本部分可编辑。
列表部分总可见。
3、DropDownWidth 属性:⽤于获取或设置组合框下拉部分的宽度(以像素为单位),有些列表项太长,则需要通过改变该属性来显⽰该类表项的全部⽂字,如果未设置 DropDownWidth 的值,该属性返回组合框的 Width。
qt style用法在Qt 中,可以通过样式表(Style Sheets)来设置和修改控件的外观。
样式表是一种基于CSS 的语法,允许你为Qt 应用程序中的控件指定样式。
以下是一些关于Qt 样式表的基本用法:1. 在控件上应用样式表:使用`setStyleSheet` 方法将样式表应用到控件上。
```cppQPushButton* button = new QPushButton("Click me");button->setStyleSheet("background-color: lightblue; color: black;");```上述代码将创建一个按钮,并为其设置背景颜色为浅蓝色,文本颜色为黑色。
2. 选择器和属性:使用选择器和属性来选择特定的控件和设置它们的样式。
```cpp// 选择所有QPushButtonQPushButton {background-color: lightblue;color: black;}// 选择具有"important" 样式类的QPushButtonQPushButton[styleClass="important"] {font-weight: bold;}```这里的`styleClass` 是一个自定义属性,你可以在代码中使用`setProperty` 方法设置。
3. 伪状态和伪元素:使用伪状态(如`:hover`、`:checked`)和伪元素(如`::indicator`、`::sub-control`)来设置控件的不同状态下的样式。
```cpp// 悬停状态下的QPushButtonQPushButton:hover {background-color: darkblue;color: white;}// 选中状态下的QCheckBoxQCheckBox:checked {color: green;}```4. 全局样式表:在整个应用程序中应用全局样式表。
qstandarditem checkbox 样式为了满足标题描述的需求,本文将以讨论QStandardItem中checkbox的样式为主题展开,不再作限定于某种特定格式书写。
以下是对该主题的详细探讨。
在Qt框架中,QStandardItem是Qt提供的一种用于存储数据的通用模型类,可以在各种视图类中使用。
它提供了丰富的接口和功能,使得我们可以更加灵活地操作和管理数据。
其中,QStandardItem的一种常见用法是作为QStandardItemModel的子项来展示列表和树状结构,这也是我们今天所关注的重点。
在QStandardItemModel中,我们可以通过使用QStandardItem的setCheckState()函数,来为某个项添加checkbox,并设置其初始状态。
checkbox可用于多项选择、全选、逐项选择以及标记完成等操作,为用户提供了更好的交互体验。
而在QStandardItemModel中,我们通过遍历模型中的项来访问或修改其中的checkbox状态,实现与用户的交互。
首先,我们需要为QStandardItem设置样式。
Qt提供了一种便捷的方式,即使用Qt Style Sheets来修改checkbox的样式。
Qt Style Sheets 是一种基于CSS语法的样式表,可以为控件添加背景、边框、字体、颜色等属性,从而实现更加丰富和独特的界面效果。
对于QStandardItem中的checkbox,我们可以通过设置QStandardItemModel 的样式表来实现。
下面是一个简单的示例代码,展示了如何通过Qt Style Sheets修改QStandardItemModel中checkbox的样式:```QStandardItemModel* model = new QStandardItemModel();ui->treeView->setModel(model);QStandardItem* item = new QStandardItem("Item 1");item->setCheckable(true);item->setCheckState(Qt::Checked);model->appendRow(item);item = new QStandardItem("Item 2");item->setCheckable(true);item->setCheckState(Qt::Unchecked);model->appendRow(item);QString styleSheet = "QTreeView::indicator:checked { image:url(:/images/checked.png); }""QTreeView::indicator:unchecked { image:url(:/images/unchecked.png); }";ui->treeView->setStyleSheet(styleSheet);```在上述示例中,首先创建一个QStandardItemModel,并将其设置为QTreeView的模型。
一起学VB——010 组合框ComboBox组合框(ComboBox)的本质是文本框(TextBox)和列表框(ListBox)的组合。
组合框的属性方法和事件与文本框和列表框的大多数用法一致。
例如,List 属性、ListIndex属性、Clear方法等都是一样的。
因此这里将只介绍组合框特有的属性Style属性返回或设置一个值,该值用来确定组合框的样式。
组合框有0、1、2三种样式。
0:下拉式组合框。
默认样式。
由一个文本框和一个下拉式列表框组成。
用户可以在文本框输入文本,也可以在下拉式列表框选择已有项目。
1:简单组合框。
由一个文本框和一个不能下拉的列表框组成。
可以在文本框中输入文本,也可以在非下拉式式列表框中选择项目。
2:下拉式列表。
外观等同于样式0,但是用户只能在下拉式列表框中选择项目,而不能在文本框中输入文本。
实战操作练习题要求:设计一个学生信息录入系统,输入学生姓名、学号,选择学院和专业,选择或输入兴趣爱好后,单击添加按钮,即可将学生信息添加至系统中。
步骤一:新建工程,创建控件,按照下图样式进行布局。
步骤二:修改控件属性,Caption属性按照下图设置,三个ComboBox的Style 属性分别设置为2、2、1。
步骤三:进入代码编辑区,编写事件代码。
步骤四:允许程序,调试测试效果。
填写姓名、学号,选择学院、专业,选择或自填兴趣爱好,单击添加,即可将学生信息添加至列表框中。
好啦,本节课程关于组合框的使用教程就到这里啦,小伙伴们一定要勤加练习哦。
我们下节课程再见。
Qt⾃定义控件之可伸缩组合框(GroupBox)控件摘要本⽂基于QGroupBox扩展了⼀种可以伸缩的组合框,正常状态下,组合框处于收缩状态,内部的控件是隐藏的;需要的时候,可以将组合框进⾏伸展,并将内部控件显⽰出来。
正⽂实现的代码⽐较简单,主要有以下⼏点:1、该组合框继承于QGroupBox;2、通过QSS将QGroupBox的默认Check图标替换;3、通过QGroupBox的setFlat函数显⽰隐藏垂直边框4、使⽤时,设置⽗窗⼝的layout的SizeConstraint为SetFixedSize,否则否则在ExtendedGroupBox收缩时,⽆法动态调整⼤⼩。
代码如下:QSS样式:QGroupBox#ExtendedGroupBox::indicator{width: 8px;height: 8px;}QGroupBox#ExtendedGroupBox::indicator:unchecked{image: url(:/icons/uncheck.png);}QGroupBox#ExtendedGroupBox::indicator:checked{image: url(:/icons/check.png);}#ifndef EXTENDED_GROUP_BOX_H_#define EXTENDED_GROUP_BOX_H_#include <QGroupBox>#include <QVector>class ExtendedGroupBox : public QGroupBox{Q_OBJECTpublic:enum State{STATE_NORMAL,STATE_EXPAND};public:ExtendedGroupBox(QWidget *parent = nullptr, State state = STATE_NORMAL);ExtendedGroupBox(const QString &title, QWidget *parent = nullptr, State state = STATE_NORMAL);private Q_SLOTS:void onChecked(bool checked);public:void addWidget(QWidget *widget);State getState() const;private:QVector<QWidget*> children_;State state_;};#endif//EXTENDED_GROUP_BOX_H_#include "ExtendedGroupBox.h"ExtendedGroupBox::ExtendedGroupBox(QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/): QGroupBox(parent){setObjectName("ExtendedGroupBox");setCheckable(true);state_ = state;if (state_ == STATE_NORMAL){//隐藏垂直边框setFlat(true);setChecked(false);}connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool)));}ExtendedGroupBox::ExtendedGroupBox(const QString &title, QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/) : QGroupBox(title, parent){setObjectName("ExtendedGroupBox");setCheckable(true);state_ = state;if (state_ == STATE_NORMAL){//隐藏垂直边框setFlat(true);setChecked(false);}connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool)));}void ExtendedGroupBox::addWidget(QWidget *widget){if (widget != nullptr){if (state_ == STATE_NORMAL){widget->setVisible(false);}children_.push_back(widget);}}void ExtendedGroupBox::onChecked(bool checked){if (checked){//显⽰垂直边框setFlat(false);for (auto iter = children_.begin(); iter != children_.end(); ++iter){(*iter)->setVisible(true);}state_ = STATE_EXPAND;}else{//隐藏垂直边框setFlat(true);for (auto iter = children_.begin(); iter != children_.end(); ++iter){(*iter)->setVisible(false);}state_ = STATE_NORMAL;}}ExtendedGroupBox::State ExtendedGroupBox::getState() const{return state_;}#include "ExtendedGroupBox.h"#include <QDialog>#include <QVBoxLayout>#include <QHBoxLayout>#include <QFormLayout>#include <QCheckBox>#include <QProgressBar>#include <QFile>#include <QtWidgets/QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);QFile file(":/stylesheets/style.qss");bool s = file.open(QFile::ReadOnly);a.setStyleSheet(file.readAll());file.close();QDialog w;QVBoxLayout *vbox_layout = new QVBoxLayout();//设置窗⼝的layout的SizeConstraint为SetFixedSize,//否则在ExtendedGroupBox收缩时,⽆法动态调整⼤⼩。
qcheckbox的用法QCheckBox是Qt框架中的一个类,它表示一个复选框。
其用法如下:1. 在Qt应用程序中包含QCheckBox头文件:cpp#include <QCheckBox>2. 创建一个QCheckBox对象,并设置其父对象(如果需要):cppQCheckBox *checkBox = new QCheckBox("显示提示"); checkBox->setParent(this); 设置父对象为当前窗口(可选)3. 设置和获取复选框的文本内容:cppcheckBox->setText("显示提示");QString text = checkBox->text();4. 设置和获取复选框的选中状态:cppcheckBox->setChecked(true); 设置为选中状态bool checked = checkBox->isChecked(); 获取当前状态5. 监听复选框的选中状态改变的信号:cppconnect(checkBox, &QCheckBox::stateChanged, this,&MyClass::onCheckBoxStateChanged);6. 实现槽函数,响应复选框的选中状态改变:cppvoid MyClass::onCheckBoxStateChanged(int state){if(state == Qt::Checked){复选框被选中}else if(state == Qt::Unchecked){复选框被取消选中}}以上是QCheckBox的基本用法,通过设置文本、选中状态以及监听信号,可以实现复选框的各种功能和交互操作。
嗯Qt样式使用说明一、声明:1.文档说明:●学习Qt样式表前提:如果你了解CSS,那么我相信这对你来说会很容易理解并应用于实际界面美化,它与CSS 有些相似之处,当然如果同时也了解Qt,那么你会很快学会如何运用Qt样式为程序设计出漂亮的界面。
●阅读本说明文档:首先一、阅读声明,二、名词解释,三、语法简介,六、附属例题解释,每次实验并对照着五、样式表参照表,体会并学习如何运用样式表里关键词。
●样式表参照表之间的关系很复杂:很多需要重复描述的选择器、属性、值,但由于本文档不能跳转,所以要自己去查找,按照它语法关系层层迭代定位表格,并按照字母表顺序定位要查找内容的大概范围。
这里的表格以Qt help文档为准。
●暂不介绍:为了尽快完成本文档的初步可使用的目的,很多在本程序中暂时用不到的窗口部件暂未解释介绍,窗口部件介绍表格中会提到“暂不介绍”,但是辅助控制器,属性,值都是完全展示在表格中。
●附加的例题格式说明:例子是经过实验得出的结论,用C语言的注释方式添加到相应的样式代码后面,当然你的文件( .CSS) 同样满足这个注释方式。
/* 注释内容 *//*imagesForExample: example_for_XXX000.png */实例图片●如何做实验:Qt源码bin目录下的designer.exe,运行/拖入控件/右键/改变样式表/应用;Qt Creator也可以。
●遇到问题请尽快联系作者2.背景介绍:Qt为图形界面应用程序提供一个完整的C++应用程序开发框架。
Qt的样式表主要是受到CSS的启发,通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(),你可以为一个独立的子部件、整个窗口,甚至是整个应用程序指定一个样式表。
样式表由影响窗口部件绘制的样式规则组成。
这些规则都是普通文本。
由于在运行时会解析样式表,所以可以通过定制样式表的方式来尝试设计不同的Qt应用程序。
ComboBox控件的用法(转载)一、如何添加/删除Combo Box内容1,在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。
换行用ctrl+回车。
2,在程序初始化时动态添加如://控件内容初始化CString strTemp;((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetConte nt();//消除现有所有内容for(int i=1;i<=100;i++){strTemp.Format("%d",i);((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(st rTemp);}3,下拉的时候添加如:CString strTemp;intiCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCou nt();//取得目前已经有的行数if(iCount<1)//防止重复多次添加{((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetConte nt();for(int i=1;i<=100;i++){strTemp.Format("%d",i);((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(st rTemp);}}4,删除DeleteString( UINT nIndex )//删除指定行,5,插入InsertString( int nIndex, LPCTSTR lpszItem )//将行插入到指定位置6,查找FindString( int nStartAfter, LPCTSTR lpszItem )//可以在当前所有行中查找指定的字符串的位置,nStartAfter指明从那一行开始进行查找。
Qt Style Sheet实践(二):组合框QComboBox的定制
导读
组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分。在许多既需要用户选
择、又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求。如我们经常使用的聊天软件QQ登录框,
便是一个很好的应用例子:
显然,用户既可以自己手动输入新的QQ号码,也可以在列表框中选择历史输入记录。对于提高用户体验是一个不
错的手段。这篇博文重点讲述如何用QSS对组合框进行定制。
基本自定义
组合框的使用非常简单,为了加快叙述速度,我们直接在Qt Designer中拖一个QComboBox控件放到主窗口中。
此时,我们什么都不用做就有了一个简单的组合框,如下:
但很显然,我们得添加一个文字,否则QComboBox不会显示任何内容。这样出现的组合框样式很普通:一个文
本加一个带箭头号的按钮就完了。既然主题是用QSS来定制组合框,那么我们第一件事就是新建一个.qss文件并添加
到资源文件中进行编译。.qss文件的内容初步编写如下:
QComboBox {
border: 1px solid gray;
border-radius: 3px;
padding: 1px 2px 1px 2px; # 针对于组合框中的文本内容
min-width: 9em; # 组合框的最小宽度
}
我们给组合框3个像素的圆角,边框1个像素宽并将颜色设置为灰色。看看效果:
文本框部分似乎还不错,但是右边的按钮外观实在是太丑了,和整体风格不搭。我们继续美化一下按钮。按钮是
QComboBox的一个子组件,用::drop-down指代。编写如下QSS代码:
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 20px;
border-left-width: 1px;
border-left-color: darkgray;
border-left-style: solid; /* just a single line */
border-top-right-radius: 3px; /* same radius as the QComboBox */
border-bottom-right-radius: 3px;
}
QComboBox::down-arrow {
image: url(:/misc/down_arrow_2);
}
可以看到,我们分别将按钮右上角和右下角设置了3个像素的圆角,这是因为我们前面给组合框的整体边框设置了
圆角。如果不给按钮设置圆角,那么按钮的棱角将会遮挡住整体边框的圆角效果。另外,我们改变了按钮上的箭头图标。::
down-arrow也是一个子组件,我们用image属性替换了系统默认的图标。对比一下:
嗯,整体风格上看起来协调些了。当然了,在::drop-down子组件的定制中,我们将subcontrol-position属性
设置成了top, right。这样按钮就位于最右边了。如果希望将按钮置于最左边显然也很简单。只需要将subcontrol-p
osition设置为top, left,然后改变一下QComboBox的padding值就可以达到目的了。我们再拉出下拉框看看:
有什么问题呢?显然,下拉框中的选项高度太小了,看起来挺别扭的。那么如何对下拉框进行定制呢?我们有个很
好的模仿对象:
360安全卫士的登录框中的下拉框看起来就挺不错,而且还有图标出现在选项的右边。下面我们就进入高级定制部
分。看看又该如何进行改进。
高级自定义
要实现上述效果,我们首先要做的就是将QComboBox设置为可以编辑的(setEditable())。这样,文本框中的
内容才可以手动进行输入。另外,我们还注意到,下拉框中的选项右边还有图标出现,QQ的登录框中也出现了图标。
我们最直观的想法就是用布局管理器(水平或垂直的)将所有组件组装成一个整体,然后再添加到下拉框中去。
怎么做呢?幸运的是,QComboBox内部也是Model/View框架来维护下拉框内容的。因此,最直接的方法就
是定义一个QListWidget,将这个QListWidget设置为QComboBox的View,而将QListWidget的Model设置为
QComboBox的Model。QListWidget只是一个View类,因此我们还得自定义View类中的Item啊。
那好,自QWidget派生一个子类,实现水平布局,将所有子组件添加到里面去:
ComboboxItem::ComboboxItem(QWidget *parent)
: QWidget(parent)
{
m_img = new QLabel(this);
QPixmap pic(QStringLiteral(":/misc/preference"));
m_img->setPixmap(pic);
m_img->setFixedSize(pic.size());
m_label = new QLabel(this);
m_layout = new QHBoxLayout(this);
m_layout->addWidget(m_label);
m_layout->addStretch();
m_layout->addWidget(m_img);
m_layout->setSpacing(5);
m_layout->setContentsMargins(5, 5, 5, 5);
setLayout(m_layout);
}
代码很简单,定义了两个标签QLabel,一个显示文本,一个显示图标。用水平布局管理器添加到QWidget中去。
ThemeRoller::ThemeRoller(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_listWidget = new QListWidget(this);
// 设置子项目代理,否则下拉框选项周围会出现虚线框
m_listWidget->setItemDelegate(new
NoFocusFrameDelegate(this));
ui.comboBox->setEditable(true);
ui.comboBox->setModel(m_listWidget->model());
ui.comboBox->setView(m_listWidget);
// 在下拉框中添加5个选项
for (int i = 0; i < 5; ++i)
{
ComboboxItem* item = new ComboboxItem(this);
item->setLabelContent(QString("Account") +
QString::number(i, 10));
connect(item, SIGNAL(chooseAccount(const QString&)),
this, SLOT(onChooseAccount(const QString&)));
QListWidgetItem* widgetItem = new
QListWidgetItem(m_listWidget);
m_listWidget->setItemWidget(widgetItem, item);
}
}
我们还将ComboboxItem的chooseAccount()信号关联到了onChooseAccount()槽。这样,当用户点击了选
项中的某一个选项时,能够在QComboBox的文本框中显示选中的项。那么,QSS该如何编写呢?
QComboBox QAbstractItemView::item {
height: 25px;
}
QListView::item {
background: white;
}
QListView::item:hover {
background: #BDD7FD;
}
也很简单,只是设置了选项中的高度,和QComboBox的高度保持一致,这样看起来不至于别扭。然后给选项设
置了鼠标悬停背景色。至此,整个定制过程就结束了。看看效果如何:
小结
QComboBox分成三个定制部分:文本框(是否可编辑),按钮(箭头标记、边框),下拉框(选项高度、子组
件布局)。由以上可见,我们利用QSS可以很好的实现出自己想要的效果,而且效果还不赖。