QT开发(六十五)——QT样式表编程实例

QT开发(六十五)——QT样式表编程实例

一、QComboBox组合框样式定制

1、基本定义

QComboBox 
{
    border: 1px solid gray;
    border-radius: 3px;
    padding: 1px 2px 1px 2px;  # 针对于组合框中的文本内容
    min-width: 9em;   # 组合框的最小宽度
}
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.png);
}

2、高级自定义

设置QComboBox为可编辑。

QComboBox *combo = new QComboBox(this);

combo->setEditable(true);

combo->addItem("apple");

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);
}
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);
    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的文本框中显示选中的项。

QComboBox QAbstractItemView::item {
    height: 25px;
}
 
QListView::item {
    background: white;
}
 
QListView::item:hover {
    background: #BDD7FD;
}

二、选择按钮QRadioButtonQCheckBox样式定制

QRadioButton和QCheckBox是界面设计中的重要元素。QRadioButton只允许用户在一组选项中选择一个,且当其中一个被选中的时候,按钮组中的其他单选按钮自动取消。QCheckBox则可以让用户同时选中多个选项,QCheckBox经过设置还具备第三种状态:未决状态(partially checked)。

QRadioButton:
QRadioButton::indicator 
{   # indicator是一个子组件,这里的width和height分别指定按钮的宽和高
    width: 13px;
    height: 13px;
}
 
QRadioButton::indicator::unchecked 
{   # 未选中时状态,也即正常状态
    image: url(:/images/radiobutton_unchecked.png);
}
 
QRadioButton::indicator:unchecked:hover 
{   # 未选中时,鼠标悬停时的状态
    image: url(:/images/radiobutton_unchecked_hover.png);
}
 
QRadioButton::indicator:unchecked:pressed 
{   #未选中时,按钮下按时的状态
    image: url(:/images/radiobutton_unchecked_pressed.png);
}
 
QRadioButton::indicator::checked 
{   # 按钮选中时的状态
    image: url(:/images/radiobutton_checked.png);
}
 
QRadioButton::indicator:checked:hover 
{   # 按钮选中时,鼠标悬停状态
    image: url(:/images/radiobutton_checked_hover.png);
}
 
QRadioButton::indicator:checked:pressed 
{ # 按钮选中时,鼠标下按时的状态
    image: url(:/images/radiobutton_checked_pressed.png);
}
QCheckBox:
QCheckBox {
    spacing: 5px;
}
 
QCheckBox::indicator {
    width: 15px;
    height: 15px;
}
 
QCheckBox::indicator:unchecked {
    image: url(:/buttonbg/checkbox_normal);
}
 
QCheckBox::indicator:unchecked:disabled {
    image: url(:/buttonbg/checkbox_disable);
}
 
QCheckBox::indicator:unchecked:hover {
    image: url(:/buttonbg/checkbox_hover);
}
 
QCheckBox::indicator:checked {
    image: url(:/buttonbg/checkbox_down);
}
 
QCheckBox::indicator:indeterminate {
    image: url(:/buttonbg/checkbox_indeterminate);
}

三、QLineEdit行编辑框样式定制

A、设置QLineEdit行编辑框的大小和占位符

edit->setPlaceholderText(QStringLiteral("E-Mail:"));

edit->setFixedSize(200, 30);

B、QLineEdit行编辑框的样式设置

设置QLineEdit行编辑框的边框、圆角、背景色、选中背景色、字体大小

QLineEdit

{

border: 1px solid rgb(41, 57, 85);

border-radius: 3px;

background: white;

selection-background-color: green;

font-size: 14px ;

}

设置鼠标悬停时QLineEdit行编辑框的边框、背景色

QLineEdit:hover

{

border: 1px solid red;

background:blue;

}

C、设置QLineEdit行编辑框作为密码输入框

设置QLineEdit行编辑框作为密码输入框

edit->setEchoMode(QLineEdit::Password);

利用QSS中的lineedit-password-character属性,可以更改密文显示字符内容。

使用一个属性选择器来进行选择,当QLineEdit对象的echoMode属性值为2时,将密文显示字符设置为某个字符。35在ASCII码中对应字符为‘#’,‘*’对应的ASCII码值为42。

D、自动补全功能

文本编辑框的自动补全功能在数据过滤器中使用较为常见,用于过滤不相干数据直奔目标数据。

QT提供了一个类QCompleter来完成自动补全功能。

m_model = new QStandardItemModel(0, 1, this);

m_completer = new QCompleter(m_model, this);

lineEdit->setCompleter(m_completer);               connect(m_completer, SIGNAL(activated(const QString&)), this,SLOT(onTextChoosed(const QString&)));

connect(ui.lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(onTextChanged(const QString&)));

使用一个Model类来存储数据。当用户输入发生变化时,将文本内容提取出来添加一个邮箱后缀并保存到Model类中。由于已经将m_model设置成了QCompleter类的Model,因此当更新Model类的数据时,QCompleter的下拉列表的内容也会同步更新。实现两个槽函数来响应文本变化信号和列表项激活的信号:

void onTextChoosed(const QString& email)
{
    lineEdit->clear();    
    lineEdit->setText(email);
}
 
void onTextChanged(const QString& str)
{
    if (str.contains("@")) 
    {
        return;
    }
    QStringList strlist;
    strlist << "@163.com" << "@qq.com" << "@gmail.com" << "@hotmail.com" << "@126.com";
 
    m_model->removeRows(0, m_model->rowCount());   
    for (int i = 0; i < strlist.size(); ++i)
    {
        m_model->insertRow(0);
        m_model->setData(m_model->index(0, 0), str + strlist.at(i));
    }
}

将信号activated()连接到槽onTextChoosed()。当用户用鼠标选择了某一项后就把选中的项更新到文本框中,补全完成。信号textChanged()连接到onTextChanged()用于更新Model中的数据。

时间: 2024-12-06 13:14:20

QT开发(六十五)——QT样式表编程实例的相关文章

QT开发(十五)——QT坐标系统

QT开发(十五)--QT坐标系统 一.QT坐标系简介 Qt中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小.原点即为(0,0)点,以像素为单位增减. 二.坐标系变换 坐标系变换是利用变换矩阵来进行的, 通常利用QTransform类来设置变换矩阵.QPainter类提供了对坐标系的平移,缩放,旋转,扭曲等变换函数. void translate(const QPointF & offset) void transla

一起talk C栗子吧(第一百六十五回:C语言实例--C语言中的常量)

各位看官们,大家好,上一回中咱们说的const关键字的例子,这一回咱们说的例子是:C语言中的常量 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在上一回中介绍了const关键字,大家都知道被const修饰的都是常量.提到常量,我们在程序中经常使用它,这一回中我们一起看看C语言中的其它常量. 大家都知道,常量的值是固定的,而且不能被修改.在C语言中,一共有四种实现常量的方式,它们分别是: 字面常量 宏 const 枚举. 接下来我们分别介绍这四种实现常量的方式. 字面常量:字

python练习六十五:类的使用实例

代码: 1 class human(): #定义基类,包括属性和方法 2 def __init__(self,name,eye=2,age=98,city='陕西'): #属性值有四个,分别为name,eye,age,city 3 self.name = name 4 self.eye = eye 5 self.age = age 6 self.city = city 7 8 def action(self): #基类定义的方法 9 print('我祖籍是{},已经{}岁了,我的名字是叫{},{

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

QT开发(十二)——QT事件处理机制

QT开发(十二)--QT事件处理机制 一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 鼠标事件: 鼠标移动,鼠标按键的按下和松开 拖放事件: 用鼠标进行拖放 滚轮事件: 鼠标滚轮滚动 绘屏事件: 重绘屏幕的某些部分 定时事件: 定时器到时 焦点事件: 键盘焦点移动 进入和离开事件: 鼠标移入widget之内,或是移出 移动事件: widget的

QT开发(十九)——QT内存泄漏问题

QT开发(十九)--QT内存泄漏问题 一.QT对象间的父子关系 QT最基础和核心的类是:QObject,QObject内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children. QT对象之间可以存在父子关系,每一个对象都可以保存它所有子对象的指针,每一个对象都有一个指向其父对象的指针. 当指定QT对象的父对象时,父对象会在子对象链表中加入该对象的指针,该对象会保存指向其父对象的指针. 当QT对象被销毁时,

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

QT开发(七)——QT按钮组件

QT开发(七)--QT按钮组件 QT中有六种按钮组件,分别是按压按钮QPushButton.工具按钮QToolButton.单选按钮QRadioButton.多选按钮QCheckBox.命令链接按钮QCommandLinkButton.按钮盒QButtonBox. 一.QPushButton组件 1.QPushButton组件简介 QPushButton组件用于接受用户点击事件,能够显示提示字符串,是功能性组件,需要父组件作为容器,能够在父组件中进行定位,用于执行命令或触发事件. QPushBu

S3C2416裸机开发系列十五_GCC下uCOS的移植(1)

S3C2416裸机开发系列十五 GCC下uCOS的移植(1) 象棋小子    1048272975 操作系统是用来管理系统硬件.软件及数据资源,控制程序运行,并为其它应用软件提供支持的一种系统软件.根据不同的种类,又可分为实时操作系统.桌面操作系统.服务器操作系统等.对于一些小型的应用,对系统实时性要求高,硬件资源有限等的情况下,应尽量避免使用复杂庞大的操作系统(如Linux),使用小型的实时操作系统(如uCOS)更能满足应用的需求.笔者此处就uCOS-II的移植作一个简单的介绍. 1. 代码准