当前位置: 首页 > news >正文

Qt开发 | qss简介与应用

文章目录

  • 一、qss简介与应用
  • 二、QLineEdit qss介绍与使用
  • 三、QPushButton qss
    • 1.常用qss
      • 1.1 基本样式表
      • 1.2 背景图片
      • 1.3 图片在左文字在右
    • 2.点击按钮弹出菜单以及右侧箭头样式设置
    • 3.鼠标悬浮按钮弹出对话框
  • 四、QCheckBox qss妙用:实时打开关闭状态按钮
  • 五、QComboBox样式表介绍
  • 六、QProgressBar用法及qss
      • 1. 水平样式1
      • 2.水平样式2
      • 3.竖直样式表
      • 4.其它竖直样式--渐变色
  • 七、QSlider样式表介绍
  • 八、qss加载方式详解
  • 九、控件提升
  • 十、Qt鼠标相对位置、绝对位置、窗口位置、控件位置、控件大小、控件绝对位置
  • 十一、自定义QLineEdit实现搜索编辑框
  • 十二、自定义QTabWidget实现tab在左,文本水平

一、qss简介与应用

  Qt Style Sheets ,简写是QSS,Qt样式表,用于修改控件外观,美化界面。它类似于前端的CSS(Cascading Style Sheets)但专门用于Qt应用程序。QSS允许开发者通过样式表来控制窗口部件的外观和感觉,而无需修改应用程序的源代码。

qss的简介与应用详细可参考:Qt开发 | qss介绍 | 常用样式 | 控件样式应用 | qss选择器

二、QLineEdit qss介绍与使用

  常用属性设置

setReadOnly(false);  // 只读
setFocusPolicy(Qt::NoFocus); // 设置控件的焦点策略:无法获得焦点
setMaxLength(10); // 最多输入10个字符
setEchoMode(QLineEdit::Password); //设置行编辑的回显模式为密码模式-6

  =文本对齐方式

lineedit->setAlignment(Qt::AlignLeft)    //左对齐 
lineedit->setAlignment(Qt::AlignRight)   //右对齐  
lineedit->setAlignment(Qt::AlignCenter)  //居中对齐 

  正则控制输入。例如:第一个数是1-9的,第二个数和之后的是0-9的

QRegExp regx("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}");	//邮箱正则
QValidator *validator = new QRegExpValidator(regx, ui->lineEdit);
lineEdit->setValidator(validator);	//设置行编辑值的验证器为正则,满足正则的输入才为有效值

  样式设置

image-20240701123733377

qss代码

QLineEdit{border: 1px solid #ABCDA0;      /* 边框宽度为1px,颜色为#A0A0A0 */border-radius: 3px;         /* 边框圆角 */padding-left: 5px;           /* 文本距离左边界有5px */background-color: #F2F2F2;     /* 背景颜色 */color: #A0A0A0;     /* 文本颜色 */selection-background-color: #A0A0A0;     /* 选中文本的背景颜色 */selection-color: #F2F2F2;    /* 选中文本的颜色 */font-family: "Microsoft YaHei";    /* 文本字体族 */font-size: 10pt;    /* 文本字体大小 */
}QLineEdit:hover { /* 鼠标悬浮在QLineEdit时的状态 */border: 1px solid #298DFF;border-radius: 3px;background-color: #F2F2F2;color: #298DFF;selection-background-color: #298DFF;selection-color: #F2F2F2;
}/*0为正常显式,1为ubuntu模式下,2为密码显式,3为ubuntu下的密码显式--看不到输入内容*/
/*与方法setEchoMode(QLineEdit::EchoMode)一起使用*/
QLineEdit[echoMode="2"] { /* QLineEdit有输入掩码时的状态 */lineedit-password-character: 9679;lineedit-password-mask-delay: 2000;
}QLineEdit:disabled { /* QLineEdit在禁用时的状态 */border: 1px solid #CDCDCD;background-color: #CDCDCD;color: #B4B4B4;
}QLineEdit:read-only { /* QLineEdit在只读时的状态 */background-color: #CDCDCD;color: #F2F2F2;
}

三、QPushButton qss

1.常用qss

1.1 基本样式表

  基本样式表示例如下:

QPushButton
{  /* 前景色, 文字的颜色 */  color:green;  /* 背景色 */  background-color:rgb(223,223,223);  /* 边框风格 */  border-style:outset;  /* 边框宽度 */  border-width:0.5px;  /* 边框颜色 */  border-color:rgb(10,45,110);  /* 边框倒角 */  border-radius:10px;  /* 字体 */  font:bold 22px;  /* 控件最小宽度 */  min-width:100px;  /* 控件最小高度 */  min-height:20px;  /* 内边距 */  padding:4px;  
} /* 鼠标按下时的效果,这里指定了对象名称 */ 
QPushButton#pushButton:pressed 
{  /* 改变背景色 */  background-color:rgb(40,85,20);  /* 改变边框风格 */  border-style:inset;  /* 使文字有一点移动 */  padding-left:6px;  padding-top:6px;  
}/* 按钮样式 */ 
QPushButton:flat 
{  border:2px solid red;  
} /*鼠标悬浮时的效果*/
QPushButton:hover
{color:#0000ff;background-color:rgb(210, 205, 205); /*改变背景色*/border-style:inset;/*改变边框风格*/padding-left:8px;padding-top:8px;
}

效果图:

image-20240701144107990

悬浮时:

image-20240701144128463

点击时:

image-20240701144145432

  还可以单独指定按钮,用#标明例如:

/*鼠标悬浮时的效果*/
QPushButton#btn2:hover
{color:#0000ff;background-color:rgb(100, 100, 20); /*改变背景色*/border-style:inset;/*改变边框风格*/padding-left:8px;padding-top:8px;
}

  相关状态

:checked      button部件被选中
:unchecked    button部件未被选中
:disabled     部件被禁用
:enabled      部件被启用
:focus        部件获得焦点
:hover        鼠标位于部件上
:pressed      部件被鼠标按下
:indeterminate    checkbox或radiobutton被部分选中
:off              部件可以切换,且处于off状态
:on               部件可以切换,且处于on状态

  当按钮被禁用后(ui->pushButton->setEnabled(false);)

QPushButton:disabled
{color: blue;border-color: brown;background-color: #363636;
}

1.2 背景图片

  若要添加按钮的背景图片,则使用如下qss代码

QPushButton
{background-image:url(":/resources/user.png");background-position:center;background-repeat: no-repeat;border:none
}QPushButton:hover
{background-color:rgb(10,210,210);background-image:url(":/resources/user_hover.png")
}QPushButton:pressed
{background-color:rgb(255, 0, 0);background-image:url(":/resources/user.png");padding-left:8px;padding-top:8px;
}

svg 矢量图 :可以随着控件大小而改变,不会失真。做项目时,产品要提供6张图:正常状态、悬浮状态、点击状态(vip/非vip各一套)

效果图:

image-20240701145312098

悬浮时:

image-20240701145336041

点击时:

image-20240701145358512

1.3 图片在左文字在右

  按钮要实现这种样式,需要利用QWidget类的void setLayoutDirection(Qt::LayoutDirection direction)方法来设置控件布局方向属性。Qt::LayoutDirection 是一个枚举类型,它有两个值:

  • Qt::LeftToRight:默认值,表示布局方向是从左到右。
  • Qt::RightToLeft:表示布局方向是从右到左

qt代码:

ui->pushButton_3->setText(u8"会员");
ui->pushButton_3->setFixedSize(80, 64);
ui->pushButton_3->setIcon(QIcon(":/resources/vip_yes.png"));
ui->pushButton_3->setLayoutDirection(Qt::LeftToRight);

效果图为:

image-20240701152449123

  还可以用样式表实现这样的效果

ui->pushButton_4->setFixedSize(200, 64);
ui->pushButton_4->setText(u8"非会员");
QString btnStyle = "QPushButton{""background-image: url(:/resources/vip_no.png);""background-repeat: no-repeat;""background-origin: padding;""background-position: left;""padding-left:65px;""border: none;""background-color: rgb(0, 255, 255);""color:rgb(0, 0, 0);""text-align:left;""font: bold italic 30px \"Microsoft YaHei\";"
"}";ui->pushButton_4->setStyleSheet(btnStyle);

注意:若要使用按钮做图片在上文字在下的布局,则

  因为QPushButton继承于QWidget,图片在上文字在下的布局就等于两个QLabel的竖直布局

2.点击按钮弹出菜单以及右侧箭头样式设置

  • QPushButton如何设置菜单

    调用QPushButton的setMenu方法

    void setMenu(QMenu* menu);
    
  • 按钮菜单写法

    • 错误的写法

      在按钮槽函数里写按钮弹出菜单,此时按钮需要点两次才弹出菜单

    • 正确的写法

      在按钮槽函数外面写,例如构造函数里面写

  • 如何创建菜单

    QMenu(菜单类)添加多个QAction(菜单项)构成菜单。

    m_pRightMenu = new QMenu(this);QAction *pAction1 = new QAction("查看");
    QAction *pAction2 = new QAction("排序方式");
    QAction *pAction3 = new QAction("刷新");m_pRightMenu->addAction(pAction1);
    m_pRightMenu->addAction(pAction2);
    m_pRightMenu->addAction(pAction3);
    
  • 如何创建多级菜单

    QMenu(菜单类)除了可以添加action构成菜单,QMenu可以添加QMenu构成多级菜单

    QMenu *setMenuItems = new QMenu;QAction *sysSetAc = new QAction(u8"系统设置", this);
    QAction *playSetAc = new QAction(u8"播放设置", this);
    QAction *zimuSetAc = new QAction(u8"字幕设置", this);
    setList << sysSetAc << playSetAc << zimuSetAc;setMenuItems->addActions(setList);m_pRightMenu->addMenu(setMenuItems);
    
  • 菜单action响应

    QAction的响应需要链接信号triggered

示例:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include <string>using namespace std;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QMenu *pMenu = new QMenu;  //主菜单QMenu *fileMenuItems = new QMenu;//菜单添加iconfileMenuItems->setIcon(QIcon(":/resources/file.png"));fileMenuItems->setTitle(u8"文件");QList<QAction*> acList;// action添加iconQAction *openFileAc = new QAction(QIcon(":/resources/file.png"), u8"打开文件", this);//openFileAc->setShortcuts(QKeySequence::Print);       //设置快捷键openFileAc->setShortcut(QKeySequence("Ctrl+8"));  //随意指定快捷键QAction *openFloderAc = new QAction(u8"打开文件夹", this);QAction *openUrlAc = new QAction(u8"打开url", this);//多级子菜单项acList << openFileAc << openFloderAc << openUrlAc;fileMenuItems->addActions(acList);pMenu->addMenu(fileMenuItems);QAction *play = new QAction(QIcon(":/resources/play.png"), u8"播放", this);QAction *tools = new QAction(QIcon(":/resources/tools.png"), u8"工具", this);pMenu->addAction(play);pMenu->addAction(tools);pMenu->addSeparator();QMenu *setMenuItems = new QMenu;setMenuItems->setTitle(u8"设置");setMenuItems->setIcon(QIcon(":/resources/set.png"));QList<QAction*> setList;QAction *sysSetAc = new QAction(u8"系统设置", this);QAction *playSetAc = new QAction(u8"播放设置", this);QAction *zimuSetAc = new QAction(u8"字幕设置", this);setList << sysSetAc << playSetAc << zimuSetAc;setMenuItems->addActions(setList);pMenu->addMenu(setMenuItems);pMenu->addSeparator();QAction *exitAc = new QAction(QIcon(":/resources/exit.png"), u8"退出", this);pMenu->addAction(exitAc);ui->pushButton->setMenu(pMenu);connect(openFileAc, &QAction::triggered, [=]{QString fileName = QFileDialog::getOpenFileName(this,u8"请选择视频文件","D:/","视频(*.mp4 *.flv);;");if(fileName.isEmpty()){return;}});//R字符串写样式string menu_qss = R"(QMenu::item{font:16px;background-color:rgb(25,253,253);padding:8px 32px;margin:8px 8px;border-bottom:1px solid #FF0000;   /*底部边界*/}/*选择项设置*/QMenu::item:selected{background-color: #00FF00;})";pMenu->setStyleSheet(QString::fromStdString(menu_qss));
}Widget::~Widget()
{delete ui;
}

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

运行结果

Snipaste_2024-07-01_17-08-53

  使用头文件来引入样式修改上述效果图

qss.h

#ifndef QSS_H
#define QSS_H#include <string>using namespace std;//按钮样式--按钮可展开下拉菜单与不展开时的设置
string button_qss = R"(QPushButton{font:18px "Microsoft YaHei";color:rgb(255,255,255);border:none}/*定义 QPushButton 控件在菜单指示器打开状态下的样式*/QPushButton::menu-indicator:open{image:url(:/resources/down_arrow.svg);subcontrol-position:right center;	/*定义了下拉菜单指示器在按钮中的位置*/subcontrol-origin:padding;border:none; /*定义了子控件(菜单指示器)的定位基准点*/}/*定义 QPushButton 控件在菜单指示器关闭状态下的样式*/QPushButton::menu-indicator:closed{image:url(:/resources/up_arrow.svg);subcontrol-position:right center;subcontrol-origin:padding;border:none;}
)";/*菜单样式--*/
string menuQss = R"(QMenu{background-color:rgb(53, 63, 73);}QMenu::item{font:16px;color:white;background-color:rgb(53, 63, 73);padding:8px 32px;margin:8px 8px;/*border-bottom:1px solid #DBDBDB;  item底部颜色*/}/*选择项设置*/QMenu::item:selected{background-color:rgb(54, 54, 54);}
)";/*菜单子项样式--*/
string menuItemQss = R"(QMenu{background-color:rgb(73, 73, 73);}QMenu::item{font:16px;color:white;background-color:rgb(73, 73, 73);padding:8px 32px;margin:8px 8px;/*border-bottom:1px solid #DBDBDB;  item底部颜色*/}/*选择项设置*/QMenu::item:selected{background-color:rgb(54, 54, 54);}
)";#endif // QSS_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include "qss.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setStyleSheet("background-color:rgb(54,54,54)");  //窗体背景色QMenu *fileMenuItems = new QMenu;//菜单添加iconfileMenuItems->setIcon(QIcon(":/resources/file.png"));fileMenuItems->setTitle(u8"文件");fileMenuItems->setStyleSheet(QString::fromStdString(menuItemQss));QList<QAction*> acList;// action添加iconQAction *openFileAc = new QAction(QIcon(":/resources/file.png"), u8"打开文件", this);//openFileAc->setShortcuts(QKeySequence::Print);       //设置快捷键openFileAc->setShortcut(QKeySequence("Ctrl+8"));  //随意指定快捷键QAction *openFloderAc = new QAction(u8"打开文件夹", this);QAction *openUrlAc = new QAction(u8"打开url", this);//多级子菜单项acList << openFileAc << openFloderAc << openUrlAc;fileMenuItems->addActions(acList);QMenu *pMenu = new QMenu;  //主菜单pMenu->addMenu(fileMenuItems);QAction *play = new QAction(QIcon(":/resources/play.png"), u8"播放", this);QAction *tools = new QAction(QIcon(":/resources/tools.png"), u8"工具", this);pMenu->addAction(play);pMenu->addAction(tools);pMenu->addSeparator();QMenu *setMenuItems = new QMenu;setMenuItems->setTitle(u8"设置");setMenuItems->setIcon(QIcon(":/resources/set.png"));QList<QAction*> setList;QAction *sysSetAc = new QAction(u8"系统设置", this);QAction *playSetAc = new QAction(u8"播放设置", this);QAction *zimuSetAc = new QAction(u8"字幕设置", this);setList << sysSetAc << playSetAc << zimuSetAc;setMenuItems->addActions(setList);setMenuItems->setStyleSheet(QString::fromStdString(menuItemQss));pMenu->addMenu(setMenuItems);pMenu->addSeparator();QAction *exitAc = new QAction(QIcon(":/resources/exit.png"), u8"退出", this);pMenu->addAction(exitAc);ui->pushButton->setMenu(pMenu); //设置菜单connect(openFileAc, &QAction::triggered, [=]{QString fileName = QFileDialog::getOpenFileName(this,u8"请选择视频文件","D:/","视频(*.mp4 *.flv);;");if(fileName.isEmpty()){return;}});ui->pushButton->setText(u8"QW影音");ui->pushButton->setFixedSize(100, 32);ui->pushButton->setStyleSheet(QString::fromStdString(button_qss));pMenu->setStyleSheet(QString::fromStdString(menuQss));
}Widget::~Widget()
{delete ui;
}

运行结果

image-20240701173906182

注意:菜单弹出的位置也可以控制

3.鼠标悬浮按钮弹出对话框

  要实现鼠标悬浮按钮弹出对话框,需要利用两个事件:鼠标进入、离开事件

  • 鼠标进入控件或窗口

    void enterEvent(QEvent* event) override;
    
  • 鼠标离开控件或窗口

    void leaveEvent(QEvent* event) override;
    

示例:

CVolumeSliderDialog.h:新建音量滑动条对话窗口

#ifndef CVOLUMESLIDERDIALOG_H
#define CVOLUMESLIDERDIALOG_H#include <QDialog>
#include <QSlider>class CVolumeSliderDialog : public QDialog
{Q_OBJECTpublic:CVolumeSliderDialog(QWidget *parent = Q_NULLPTR);~CVolumeSliderDialog();void setSliderValue(int value){m_pSlider->setValue(value);}protected:bool event(QEvent* event) override;signals:void sig_SliderValueChanged(int value);private:QSlider* m_pSlider = nullptr;
};#endif

CVolumeSliderDialog.cpp

#include "CVolumeSliderDialog.h"
#include <QVBoxLayout>
#include <QEvent>
#include <windows.h>//注意由于此类使用了windows的函数SetClassLong,需要包含user32.lib
//如果是在vs2019中使用则不需要包含user32.lib
#pragma comment(lib, "user32.lib")CVolumeSliderDialog::CVolumeSliderDialog(QWidget* parent): QDialog(parent)
{this->setFixedSize(40, 200);QVBoxLayout* pVLay = new QVBoxLayout(this);m_pSlider = new QSlider(this);m_pSlider->setOrientation(Qt::Vertical);pVLay->addWidget(m_pSlider);setFixedSize(40, 120);setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip);   //ToolTip = Popup | Sheet : 悬浮是显示,离开时消失setStyleSheet("QDialog{background-color: rgba(54, 54, 54, 0.5);}");  //0.5表示透明度,0表示全透明、1表示不透明;也可以使用百分百表示如: frm->setStyleSheet(“QFrame{background-color: rgba(255, 0, 0, 50%);}”);connect(m_pSlider, &QSlider::valueChanged, [=](int value) {emit sig_SliderValueChanged(value);});
}CVolumeSliderDialog::~CVolumeSliderDialog()
{
}//参考qt文档:bool QWidget::event(QEvent *event)
//设置popup后,dialog有窗口阴影,需要去除就重写event函数
bool CVolumeSliderDialog::event(QEvent* event)
{static bool class_amended = false;if (event->type() == QEvent::WinIdChange){HWND hwnd = (HWND)winId();if (class_amended == false){class_amended = true;DWORD class_style = ::GetClassLong(hwnd, GCL_STYLE);class_style &= ~CS_DROPSHADOW;::SetClassLong(hwnd, GCL_STYLE, class_style); // windows系统函数}}return QWidget::event(event);
}

CVolumeButton.h:当鼠标进入音量按钮时,显示音量滑动条

/*
音量调节按钮
功能:1. 鼠标悬浮到音量时显示slider dialog2. 点击时mute
注意问题:重写按钮类,样式表无效
*/#pragma once#include <QPushButton>
#include "CVolumeSliderDialog.h"class CVolumeButton : public QPushButton
{Q_OBJECTpublic:CVolumeButton(QWidget* parent = nullptr);~CVolumeButton();bool getMute() const{return m_isMute;}void setMute(bool mute) { m_isMute = mute; }signals:void sig_VolumeValue(int value);protected:void paintEvent(QPaintEvent* event) override;void enterEvent(QEvent* event) override;//void leaveEvent(QEvent* event) override;void mousePressEvent(QMouseEvent* event) override;void timerEvent(QTimerEvent* event) override;private:bool m_isMute = false;  //是否静音CVolumeSliderDialog* m_pVolumeSliderDlg = nullptr;int m_timerId = -1;
};

CVolumeButton.cpp

#include "CVolumeButton.h"
#include <QMouseEvent>
#include <QStylePainter>
#include <QStyleOptionButton>
#include <iostream>
#include <QDebug>
#include <QThread>using namespace std;CVolumeButton::CVolumeButton(QWidget* parent): QPushButton(parent)
{this->setFixedSize(32,32);setStyleSheet("QPushButton{background-image:url(:/resources/audio_open.svg);border:none;}""QPushButton:hover{background-image:url(:/resources/audio_open_hover.svg);border:none;}""QPushButton:pressed{background-image:url(:/resources/audio_open.svg);border:none;}");
}CVolumeButton::~CVolumeButton()
{
}//重写控件绘制的事件
void CVolumeButton::paintEvent(QPaintEvent*)
{QStylePainter p(this);  //与CVolumeButton对象(即this指针指向的对象)关联QStyleOptionButton option;initStyleOption(&option); //将当前控件的相关信息填充到option对象中p.drawControl(QStyle::CE_PushButton, option);   //使用QStylePainter对象p来绘制一个按钮控件。//QStyle::CE_PushButton是一个枚举值,表示要绘制的控件类型是按钮。option对象包含了绘制按钮所需的所有选项和状态信息。
}//重写鼠标进入控件的事件,移动音量滑动条控件
void CVolumeButton::enterEvent(QEvent* event)
{if (!m_pVolumeSliderDlg)m_pVolumeSliderDlg = new CVolumeSliderDialog(this);//将控件的局部坐标转化成全局屏幕坐标,返回控件左上角像素点的全局屏幕坐标QPoint p1 = this->mapToGlobal(QPoint(0, 0));  //声音按钮左上角相对于桌面的绝对位置// qDebug() << p1.x() << "    " << p1.y();QRect rect1 = this->rect(); //控件内部集合形状QRect rect2 = m_pVolumeSliderDlg->rect();     //rect包含标题栏,去掉标题栏后height不变int x = p1.x() + (rect1.width() - rect2.width()) / 2;int y = p1.y() - rect2.height() - 5;m_pVolumeSliderDlg->move(x, y);   //move是相对于桌面原点的位置m_pVolumeSliderDlg->show();//启动定时器返回计时器标识符//当计时器事件发生时,会调用timerEvent()虚函数,并将QTimerEvent事件参数类传递给它。m_timerId = startTimer(250);connect(m_pVolumeSliderDlg, &CVolumeSliderDialog::sig_SliderValueChanged, [=](int value) {emit sig_VolumeValue(value);});
}//void CVolumeButton::leaveEvent(QEvent* event)
//{
//	根据鼠标的位置判断音量调节窗口是否消失
//	//QPoint p1 = QCursor::pos();   //绝对位置
//
//	//cout << "QCursor x= " << p1.x() << " y = " << p1.y() << endl;
//
//	//if (m_pVolumeSliderDlg)
//	//{
//	//	QRect rect1 = this->rect();  //按钮矩形
//	//	QRect rect2 = m_pVolumeSliderDlg->rect();
//	//	QRect rect3 = m_pVolumeSliderDlg->geometry();
//
//	//	QPoint p2 = this->mapToGlobal(QPoint(0, 0));   //声音按钮左上角相对于桌面的绝对位置
//
//	//	//已知:音量框宽40 > 按钮宽30
//	//	QRect area(rect3.left(), rect3.top(), rect2.width(), p2.y() + rect1.height() - rect3.top()); //左上宽高
//
//	//	cout << "p1 x = " << p1.x() << " y = " << p1.y() << endl;
//
//	//	if (!area.contains(p1))
//	//	{
//	//		m_pVolumeSliderDlg->hide();
//	//	}
//	//}
//}//重写鼠标按下事件;音量在静音与正常状态之间切换
void CVolumeButton::mousePressEvent(QMouseEvent* event)
{if (event->button() == Qt::LeftButton){m_isMute = !m_isMute;if (m_isMute){if (m_pVolumeSliderDlg)m_pVolumeSliderDlg->setSliderValue(0);}else{if (m_pVolumeSliderDlg)m_pVolumeSliderDlg->setSliderValue(50);}}
}/*** @brief 用定时器模拟leaveEvent,* 直接在leaveEvent里让m_pVolumeSliderDlg消失,效果不太好,* 用鼠标移动事件也不太好,定时器是比较好的做法*/
void CVolumeButton::timerEvent(QTimerEvent* event)
{if ((m_pVolumeSliderDlg != nullptr) && (m_pVolumeSliderDlg->isVisible())){//判断鼠标的位置与有效区域的关系,若不在有效区域则隐藏音量滑动条QPoint p1 = QCursor::pos();   //鼠标绝对位置if (m_pVolumeSliderDlg){QRect rect1 = this->rect();  //按钮矩形QRect rect2 = m_pVolumeSliderDlg->rect();       //获取控件的内部尺寸QRect rect3 = m_pVolumeSliderDlg->geometry();  //获取窗口整体大小和位置QPoint p2 = this->mapToGlobal(QPoint(0, 0));   //声音按钮左上角相对于桌面的绝对位置//已知:音量框宽40 > 按钮宽30//QRect:矩形区域,矩形由其左上角的坐标(x, y)、宽度和高度定义。QRect area(rect3.left(), rect3.top(), rect2.width(), p2.y() + rect1.height() - rect3.top()); //左上宽高if (!area.contains(p1)){m_pVolumeSliderDlg->hide();}}}else{killTimer(event->timerId());   //直到调用killTimer()函数,计时器事件会每隔interval毫秒发生一次}
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include "CVolumeButton.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);resize(800, 600);QHBoxLayout *pHlay = new QHBoxLayout(this);CVolumeButton* pVolumeButton = new CVolumeButton(this);pHlay->addWidget(pVolumeButton);
}Widget::~Widget()
{delete ui;
}

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

运行结果

image-20240701200554241

四、QCheckBox qss妙用:实时打开关闭状态按钮

  使用QCheckBox 实现实时打开关闭状态按钮的效果,思路是:使用QCheckBox,点击按钮时切换背景图片。

示例:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->checkBox->setFixedSize(128, 64);//样式表基于指示器的勾选状态进行切换QString qss = "QCheckBox::indicator:unchecked{ \image:url(:/resources/status_close.png); \} \QCheckBox::indicator:checked { \image: url(:/resources/status_open.png); \}";ui->checkBox->setStyleSheet(qss);ui->checkBox->setChecked(true); // 设置组框为勾选状态//ui->checkBox->setTristate(true);  //开启三态//当勾选状态改变时,QCheckBox 会发出 clicked(bool) 和 stateChanged(int) 信号。connect(ui->checkBox, &QCheckBox::stateChanged , [=](int state){qDebug() << state;});
}Widget::~Widget()
{delete ui;
}

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

运行效果

image-20240701203302928

image-20240701203314653

五、QComboBox样式表介绍

  QComboBox样式需要注意的点如下:

  • qss设置item项的高度

    除了使用qss代码外,还要使用C++代码控制

    qss代码:

    /* 下拉后,整个下拉窗体每项的样式 */
    /* 项的高度(设置pComboBox->setView(new QListView(this));后该项才起作用) */
    QComboBox QAbstractItemView::item 
    {height: 50px;   
    }
    

    qt代码:

    ui->comboBox->setView(new QListView(this));
    
  • 右侧下拉框样式

    /* 下拉框样式 */
    QComboBox::drop-down 
    {subcontrol-origin: padding;   /* 子控件在父元素中的原点矩形。如果未指定此属性,则默认为padding。 */subcontrol-position: top right;   /* 下拉框的位置(右上) */width: 32px;   /* 下拉框的宽度 */border-left-width: 1px;   /* 下拉框的左边界线宽度 */border-left-color: darkgray;   /* 下拉框的左边界线颜色 */border-left-style: solid;   /* 下拉框的左边界线为实线 */border-top-right-radius: 3px;   /* 下拉框的右上边界线的圆角半径(应和整个QComboBox右上边界线的圆角半径一致) */border-bottom-right-radius: 3px;   /* 同上 */image: url(:/resources/down.png); 
    }
    

    注意:image才是箭头的样式,不是background-image

  • 右侧下拉箭头样式

    /* 下拉箭头样式 */ 
    QComboBox::down-arrow 
    {  width: 32px; /* 下拉箭头的宽度(建议与下拉框drop-down的宽度一致) */   background: rgb(54,54,54); /* 下拉箭头的的背景色 */   padding: 0px 0px 0px 0px; /* 上内边距、右内边距、下内边距、左内边距 */  image: url(:/resources/down.png); 
    } 
    
  • QComboBox的编辑模式

    QComboBox默认是非编辑模式,调用setEditable即可设为编辑模式。

    ui->comboBox->setEditable(true);
    

    在编辑模式下,输入值按回车,即可将值添加到ComboBox中,默认添加到最后

  • QComboBox自定义排序

    在后续的模型代理视图中继续

示例:

样式1:

image-20240701233732190

qss代码为:

/* 未下拉时,QComboBox的样式 */
QComboBox 
{background:rgb(54,54,54);border: 1px solid gray;   /* 边框 */border-radius: 5px;   /* 圆角 */padding: 1px 18px 1px 3px;   /* 字体填衬 */color: white;font: normal normal 24px "Microsoft YaHei";
}

样式2:

image-20240701233812744

qss代码为

/* 未下拉时,QComboBox的样式 */
QComboBox 
{border: 1px solid gray;   /* 边框 */border-radius: 5px;   /* 圆角 */padding: 1px 18px 1px 3px;   /* 字体填衬 */color: white;font: normal normal 24px "Microsoft YaHei";background:rgb(54,54,54);
}/* 下拉后,整个下拉窗体样式 */
QComboBox QAbstractItemView 
{outline: 0px solid gray;   /* 选定项的虚框 */border: 1px solid yellow;   /* 整个下拉窗体的边框 */color: rgb(250,251,252);background-color: rgb(70,80,90);   /* 整个下拉窗体的背景色 */selection-background-color: lightgreen;   /* 整个下拉窗体被选中项的背景色 */
}/* 下拉后,整个下拉窗体每项的样式 */
/* 项的高度(设置pComboBox->setView(new QListView(this));后该项才起作用) */
QComboBox QAbstractItemView::item 
{height: 50px;   
}/* 下拉后,整个下拉窗体越过每项的样式 */
QComboBox QAbstractItemView::item:hover 
{color: rgb(90,100,105);background-color: lightgreen;   /* 整个下拉窗体越过每项的背景色 */
}/* 下拉后,整个下拉窗体被选择的每项的样式 */
QComboBox QAbstractItemView::item:selected 
{color: rgb(12, 23, 34);background-color: lightgreen;
}/* QComboBox中的垂直滚动条 */
QComboBox QAbstractScrollArea QScrollBar:vertical 
{width: 13px;background-color: #d0d2d4;   /* 空白区域的背景色*/
}QComboBox QAbstractScrollArea QScrollBar::handle:vertical 
{border-radius: 5px;   /* 圆角 */background: rgb(60,60,60);   /* 小方块的背景色深灰lightblue */
}QComboBox QAbstractScrollArea QScrollBar::handle:vertical:hover 
{background: rgb(90, 91, 93);   /* 越过小方块的背景色yellow */
}/* 设置为可编辑(setEditable(true))editable时,编辑区域的样式 */
QComboBox:editable 
{background: green;
}/* 设置为非编辑(setEditable(false))!editable时,整个QComboBox的样式 */
QComboBox:!editable 
{background: rgb(54,54,54);
}/* 设置为可编辑editable时,点击整个QComboBox的样式 */
QComboBox:editable:on 
{background: rgb(54,54,54);
}/* 设置为非编辑!editable时,点击整个QComboBox的样式 */
QComboBox:!editable:on 
{background: rgb(54,54,54);
}/* 设置为可编辑editable时,下拉框的样式 */
QComboBox::drop-down:editable 
{background: rgb(54,54,54);
}/* 设置为可编辑editable时,点击下拉框的样式 */
QComboBox::drop-down:editable:on 
{background: rgb(54,54,54);
}/* 设置为非编辑!editable时,下拉框的样式 */
QComboBox::drop-down:!editable 
{background: rgb(54,54,54);
}/* 设置为非编辑!editable时,点击下拉框的样式 */
QComboBox::drop-down:!editable:on 
{background: rgb(54,54,54);image: url(:/resources/up.png); /* 显示上拉箭头 */ 
}/* 下拉框样式 */
QComboBox::drop-down 
{subcontrol-origin: padding;   /* 子控件在父元素中的原点矩形。如果未指定此属性,则默认为padding。 */subcontrol-position: top right;   /* 下拉框的位置(右上) */width: 32px;   /* 下拉框的宽度 */border-left-width: 1px;   /* 下拉框的左边界线宽度 */border-left-color: darkgray;   /* 下拉框的左边界线颜色 */border-left-style: solid;   /* 下拉框的左边界线为实线 */border-top-right-radius: 3px;   /* 下拉框的右上边界线的圆角半径(应和整个QComboBox右上边界线的圆角半径一致) */border-bottom-right-radius: 3px;   /* 同上 */image: url(:/resources/down.png); 
}/* 越过下拉框样式 */
QComboBox::drop-down:hover 
{background: rgb(80, 75, 90);
}/* 下拉箭头样式 */ 
QComboBox::down-arrow 
{  width: 32px; /* 下拉箭头的宽度(建议与下拉框drop-down的宽度一致) */   background: rgb(54,54,54); /* 下拉箭头的的背景色 */   padding: 0px 0px 0px 0px; /* 上内边距、右内边距、下内边距、左内边距 */  image: url(:/resources/down.png); 
} /* 点击下拉箭头 */ 
QComboBox::down-arrow:on 
{   image: url(:/resources/up.png); /* 显示上拉箭头 */ 
}

六、QProgressBar用法及qss

  QProgressBar 是 Qt 框架中的进度条控件,用于显示任务的进度。通常用来表示加载数据、文件传输或其他需要时间的任务的进度。

1. 水平样式1

  QProgressBar默认是水平效果。

image-20240703120423754

qss代码:

QProgressBar
{background:rgb(54,54,54);border:none;   /*无边框*/border-radius:5px;text-align:center;   /*文本的位置*/color: rgb(229, 229, 229);  /*文本颜色*/
}/*chunk表示里面的进度条*/
QProgressBar::chunk 
{background-color:rgb(58, 154, 255);border-radius:4px;
}

2.水平样式2

  效果图:

image-20240703152431129

qss代码

QProgressBar
{border-radius:5px;background-color:darkgray;text-align:center
}QProgressBar::chunk
{background-color:#1F0FEF;width:6px;margin:5px;	/*相邻进度间距离为5*/
}

3.竖直样式表

  C++设置:

ui->progressBar_2->setOrientation(Qt::Vertical);
ui->progressBar_2->setFixedWidth(60);
ui->progressBar_2->setFixedHeight(300);

例如下面的效果

image-20240703153025058

qss代码

QProgressBar:vertical
{border-radius:5px;background-color:darkgray;text-align:center;padding-left: 5px; padding-right: 4px; padding-bottom: 2px; 
}QProgressBar::chunk:vertical
{background-color:#06B025;margin:1px;
}

4.其它竖直样式–渐变色

  渐变色

image-20240703154238932

qss代码

QProgressBar:vertical
{border-radius:5px;background-color:darkgray;text-align:center;padding-left: 5px; padding-right: 4px; padding-bottom: 2px; 
}QProgressBar::chunk:vertical
{/*QLinearGradient表示使用渐变色*/background-color:QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #00ff58,stop: 1 #034f1f);margin:1px;
}

七、QSlider样式表介绍

  滑块经常用到,如:声音调节、视频进度调节等,有水平与竖直两种。

效果图:

Snipaste_2024-07-03_15-58-55

水平的QSlider的qss:

QSlider
{background-color: #363636; border-style: outset; border-radius: 10px; 
}
/*凹槽的样式*/
QSlider::groove:horizontal
{height: 12px;background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);margin: 2px 0
}/*柄的样式*/
QSlider::handle:horizontal 
{background: QRadialGradient(cx:0, cy:0, radius: 1, fx:0.5, fy:0.5, stop:0 white, stop:1 green);width: 16px;height: 16px;margin: -5px 6px -5px 6px;border-radius:11px; border: 3px solid #ffffff;
}

竖直的QSlider的qss:

QSlider 
{background-color: rgba(22, 22, 22, 0.7);padding-top: 15px;  /*上面端点离顶部的距离*/padding-bottom: 15px;border-radius: 5px; /*外边框矩形倒角*/
}QSlider::add-page:vertical 
{background-color: #FF7826;width:5px;border-radius: 2px;
}QSlider::sub-page:vertical 
{background-color: #7A7B79;width:5px;border-radius: 2px;
}QSlider::groove:vertical 
{background:transparent;width:6px;
}QSlider::handle:vertical    
{height: 14px;  width: 14px;margin: 0px -4px 0px -4px;border-radius: 7px;background: white;
}

八、qss加载方式详解

九、控件提升

十、Qt鼠标相对位置、绝对位置、窗口位置、控件位置、控件大小、控件绝对位置

十一、自定义QLineEdit实现搜索编辑框

十二、自定义QTabWidget实现tab在左,文本水平

相关文章:

Qt开发 | qss简介与应用

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用&#xff1a;实时打开关闭状态按钮五、QComboBo…...

模块一SpringBoot(一)

maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置&#xff0c; application.properties会覆盖默认信息&#xff1a; 如覆盖端口号server.port8888...

C语言 | Leetcode C语言题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…...

​​​​Linux LVS 负载均衡群集

在业务量达到一定量的时候&#xff0c;往往单机的服务是会出现瓶颈的。此时最常见的方式就是通过负载均衡来进行横向扩展。其中我们最常用的软件就是 Nginx。通过其反向代理的能力能够轻松实现负载均衡&#xff0c;当有服务出现异常&#xff0c;也能够自动剔除。但是负载均衡服…...

onTouch()与onTouchEvent()的区别

onTouch()和onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景&#xff0c;并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法&#xff1a; onTouch() 方法 定义&#xff1a;onTouch(View v, MotionEvent event)是View.OnTouchList…...

计算机网络网络层复习题2

一. 单选题&#xff08;共22题&#xff0c;100分&#xff09; 1. (单选题)如果 IPv4 数据报太大&#xff0c;会在传输中被分片&#xff0c;对分片后的数据报进行重组的是&#xff08; &#xff09;。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…...

[JS]面向对象ES6

class类 ES6是基于 class关键字 创建类 <script>// 1.定义类class Person {// 公有属性name// 公有属性 (设置默认值)age 18// 构造函数constructor(name) {// 构造函数的this指向实例化对象// 构造函数的作用就是给实例对象设置属性this.name name// 动态添加属性(不…...

ctfshow web sql注入 web242--web249

web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…...

发送微信消息和文件

参考&#xff1a;https://www.bilibili.com/video/BV1S84y1m7xd 安装&#xff1a; pip install PyOfficeRobotimport PyOfficeRobotPyOfficeRobot.chat.send_message(who"文件传输助手", message"你好&#xff0c;我是PyOfficeRobot&#xff0c;有什么可以帮助…...

数组-螺旋矩阵

M螺旋矩阵 ||&#xff08;leetcode59&#xff09; /*** param {number} n* return {number[][]}*/ var generateMatrix function(n) {const maxNum n * n;let curNum 1;const matrix new Array(n).fill(0).map(() > new Array(n).fill(0));let row 0,column 0;const d…...

GitStack详细配置与使用指南

1.引言 GitStack是一个功能强大的Git服务器管理工具,专为Windows环境设计。它提供了一个用户友好的Web界面,使得在Windows服务器上管理Git仓库变得简单高效。本文将详细介绍GitStack的安装、配置和使用方法,帮助您快速搭建自己的Git服务器。 2.GitStack安装 2.1 系统要求 Wi…...

LoadRunner-Virtual User Generator组件学习

重点知识 LR工具是拿C写的&#xff0c;所以它的脚本默认也是C&#xff0c;但是最终生成的脚本不止是C&#xff0c;它是支持C和Java语言的&#xff0c;这个大家要清楚&#xff0c;对本身懂代码的就很友好&#xff0c;你了解java&#xff0c;那就可以把脚本改成java&#xff0c;…...

NAT地址转换实验,实验超简单

实验拓扑 实验目的 将内网区域&#xff08;灰色区域&#xff09;的地址转换为172.16.1.0 实验过程 配置静态NAT&#xff08;基于接口的静态NAT&#xff09; R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…...

pip常用命令详解

pip 是 Python 的官方第三方包管理工具之一&#xff0c;其为 Python 包的安装与管理提供了极大的便利。本文将详细介绍 pip 的常见命令及其用法&#xff0c;帮助读者更好地利用这一强大的工具。 1. 安装 pip 在开始使用 pip 之前&#xff0c;确保您的系统中已经安装了 pip。p…...

vue3从入门到精通

CDN方式使用vue: 获取复杂数据类型&#xff1a; 使用结构复制语法去除vue前缀&#xff1a; 使用模块化开发&#xff1a; 需要安装插件live server&#xff1a; 需要访问网络地址&#xff1a; 简单数据类型ref的使用&#xff1a; 如何修改number reactive修改值不需要.value&…...

kubuadm 方式部署 k8s 集群

准备三台机器 主机名IP地址CPU/内存操作系统版本角色K8S版本Docker版本k8s231192.168.99.2312C4GCentos 7master1.23.1720.10.24k8s232192.168.99.2322C4GCentos 7woker1.23.1720.10.24k8s233192.168.99.2332C4GCentos 7woker1.23.1720.10.24 需要在K8S集群各节点上面安装dock…...

Android studio 打包低版本的Android项目报错

一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…...

【教程】lighttpd配置端口反向代理

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、修改配置文件&#xff1a; sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy&#xff1a; 3、然后添加端口映射&#xff1a; 4、保存&…...

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离&#xff08;Hystix隔离&#xff09;&#xff0c;每个被隔离的业务都要创建一个独立的线程池&#xff0c;线程过多会带来额外的CPU…...

微信小程序的开发

前端&#xff1a;微信小程序开发的技术 后端&#xff1a;springboot的框架 一&#xff1a;微信小程序环境的搭建 1. 访问微信开发者官⽅⽹站的⼩程序开发⼯具下载⻚⾯。 2. 根据你的操作系统&#xff08;Windows、macOS或Linux&#xff09;选择合适的版本进⾏下载。 3. 下…...

Oracle中CREATE FORCE VIEW的说明和例子

Oracle数据库中的CREATE FORCE VIEW语句用于创建视图&#xff0c;即使在视图所依赖的基表或对象不存在&#xff0c;或者创建视图的用户对这些对象没有足够的权限时&#xff0c;也能强制创建视图。不过&#xff0c;需要明确的是&#xff0c;尽管视图能被强制创建&#xff0c;但在…...

C#反射基本应用

1、反射 反射是.NET Framework的一个特性&#xff0c;它允许在运行时获取类型的信息以及动态创建对象&#xff0c;调用方法&#xff0c;以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…...

1.英语中的从句学习

名词性从句&#xff1a; 1.最常见的连接词是that在宾语从句中的运用&#xff0c;如&#xff1a;I know that you will come. 句中的that 就是连接词&#xff0c;作用就是连接主句和从句&#xff0c;不充当成分也没有含义&#xff0c;只起风向标的作用&#xff0c;告诉你接下来…...

Perl语言简介

Perl语言&#xff0c;全称为Practical Extraction and Report Language&#xff08;实用提取与报告语言&#xff09;&#xff0c;是一种高级、通用、解释型的编程语言。它由Larry Wall于1987年首次发布&#xff0c;并迅速因其强大的文本处理能力和高度的灵活性而受到广泛应用。…...

【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息

一、使用步骤介绍 使用Jasypt&#xff08;Java Simplified Encryption&#xff09;进行数据加密和解密主要涉及几个步骤&#xff0c;包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中&#xff0c;以及应用程序启动时自动解密。以下是详细的使用说明&…...

如何确定MySQL中哪些列适合做索引

1、查询频率 频繁出现在WHERE子句、JOIN条件、ORDER BY子句或GROUP BY子句中的列是创建索引的候选列。 2、数据唯一性 具有唯一性约束的列&#xff08;如主键、唯一索引&#xff09;是创建索引的理想选择&#xff0c;因为它们可以确保查询的快速返回。 如果列中的值大部分都…...

C# winform中权限页面的设计和开发

在C# WinForm应用中设计和开发权限页面&#xff0c;主要涉及到用户界面的创建、数据模型的构建以及业务逻辑的实现。以下是一个基本的步骤&#xff0c;可用来参考构建一个权限管理页面&#xff1a; 第一步&#xff1a;设计用户界面 创建一个新的WinForm&#xff1a;在Visual S…...

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1&#xff1a;直接搜索 在电脑的搜索栏&#xff0c;输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”&#xff0c;打开 远程桌面连接 方式2&#xff1a;运行框打开服务器连接 同时按&#xff1a;Windows徽标键…...

【分布式计算框架 MapReduce】MapReduce 初级编程

目录 一、MapReduce 示例程序的导入并运行测试 二、准备 4 个小文件&#xff08;文件大小分别为 1.7M&#xff0c;5.1M&#xff0c;3.4M&#xff0c;6.8M&#xff09; 1. 第一种情况&#xff0c;默认分片&#xff1a;不修改程序代码&#xff0c;直接使用 WordCount 源程序 2…...

VideoPrism——探索视频分析领域模型的算法与应用

概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口&#xff0c;记录了从日常瞬间到科学探索的各种体验。在这个数字时代&#xff0c;视频基础模型&#xff08;ViFM&#xff09;有可能分析如此海量的信息并提取新的见解。迄今为止&#xff0c;…...