用右值引用
unused()
indicate指定 表明
(option->state & QStyle::State_Selected) ? QColor().darker(150) : color
Properties 属性,性质
Contents// 内容
Reimplemented Public Functions// 被重新实现的 公有类函数
Detailed Description// 详细描述
Inherits: QAbstractButton//继承:Additional Inherited Members //附加继承成员
encapsulates封装
painter.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿
font.setStyleStrategy(QFont::PreferAntialias);/字体抗锯齿
fileter 分发器
qDebug() << QRandomGenerator::global()->bounded(10);
//生成一个0和10.123之间的浮点数
QRandomGenerator::global()->bounded(10.123);
//生成一个10和15之间的整数
qDebug() << QRandomGenerator::global()->bounded(10, 15);
QToolTip::showText(statePoint, QString("nihao"))
QToolTip::hideText();
event->ignore();
QGraphicsItem::hoverMoveEvent(event);
//设置窗体无边框.
this->setWindowFlags(Qt::FramelessWindowHint);
this->setFixedSize(200,100);
//设置窗口背景.
QPalette palette;
palette.setColor(QPalette::Window,Qt::gray);
this->setPalette(palette);
//创建label并设置相关属性。
QLabel *label = new QLabel(this);
label->setText("hello world!");
//设置字体颜色.
label->setStyleSheet("color : rgb(255, 255, 255)");
label->setAlignment(Qt::AlignCenter);
label->resize(200,100);
//设置窗口透明度.
this->setWindowOpacity(0.8)
设置背景透明
setAttribute(Qt::WA_TranslucentBackground)
setwindowFlags(Qt;;ToolTip | Qt::FramelesswindowHint)
font-family:Microsoft Yahei; /*字体大小为20点*/
font-size:20pt; /*字体颜色为白色*/
color:white; /*背景颜色*/
background-color:rgb(14 , 150 , 254); /*边框圆角半径为8像素*/
border-radius:8px;
}/*按钮停留态*/QPushButton:hover{ /*背景颜色*/
background-color:rgb(44 , 137 , 255);
}/*按钮按下态*/QPushButton:pressed{ /*背景颜色*/
background-color:rgb(14 , 135 , 228); /*左内边距为3像素,让按下时字向右移动3像素*/
padding-left:3px; /*上内边距为3像素,让按下时字向下移动3像素*/
padding-top:3px;
关于QT控件提升后找不到头文件的解决方法
INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}
)
this->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
* //用于滚轮缩放时以鼠标中心进行缩放
this->setResizeAnchor(QGraphicsView::AnchorUnderMouse);
//用于滚轮缩放时以鼠标为中心进行缩放
setMouseTracking(true);//设置视图,鼠标跟踪功能开启,
在滚轮事件wheelEvent(QWheelEvent *event),不能继续往下传事件,继续传会影响到上边
代码效果。
QTransform QGraphicsView::transform() const///f返回当前view视图的坐标系统
获得c这个系统可以的得到当前坐标系统中缩放比例。平移参数,还有旋转参数等,
/ 获取view的宽高;
// qreal viewWidth = this->viewport()->width();
// qreal viewHeight = this->viewport()->height();
// 获取当前鼠标相对于scene的位置;
// QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y()));
void ProjectView::mouseMoveEvent(QMouseEvent* mouseEvent)
{
if (isPressed ) {
QPointF disPointF = mouseEvent->pos() - m_lastPointF;
m_lastPointF = mouseEvent->pos();
this->scene()->setSceneRect(this->scene()->sceneRect().x() - disPointF.x(),
this->scene()->sceneRect().y() - disPointF.y(),
this->scene()->sceneRect().width(),
this->scene()->sceneRect().height());
this->scene()->update();
}
QGraphicsView::mouseMoveEvent(mouseEvent);
}
P指针 d指针
事件传递过程
在事件函数中可对事件对象调用accept()和ignore(),这两个函数之间的区别在于对“事件”的反应不同,前者会把传递过来的事件给“收下”,而后者则会“无视”掉这个事件,让事件继续传播给自己的父组件(注意,是父组件,而不是父类,事件的传播是根据组件的继承关系而不是类的继承关系)。其中,无论是accept还是ignore,当前组件的事件函数依然会被调用,并不会影响当前事件函数的后续运行 Qt中默认为accept(),执行完事件函数之后就结束了;
QGraphicsView::mouseMoveEvent(mouseEvent) t这段代码是调用父类的函数处理这个事件。和ignore()有本质区别
对应窗口更新后一日有某个窗口存在,很可能是存在定时器,在某个事件中帆帆调用的结果,例如mousemoveEvent()事件,或者是定时器打开后没有关闭导致的。所以,只要存在定时器,要充分考虑需要在那些事件中关闭定时器。
如果想要对窗体直接设置阴影属性,不能直接用this->setGraphicsEffect,需要用一个控件与窗体等大,对这个控件设置,然后再将窗体设置为透明色
QGraphicsDropShadowEffect *shadow = new
QGraphicsDropShadowEffect();//阴影边框效果
shadow->setBlurRadius(10);//设置阴影四角的弧度
shadow->setColor(Qt::black);//设置阴影颜色
shadow->setOffset(0);//设置阴影距离 0就看不到边框阴影
ui->widget->setGraphicsEffect(shadow);//将阴影事件放到指定控件上
this->setAttribute(Qt::WA_TranslucentBackground);//窗体设置为透明色
控件内阴影,外阴影
方法1 通过QFrame 中的frameShape() 和frameShadow
BgWidget::BgWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::BgWidget)
{
ui->setupUi(this);
//设置窗体透明
this->setAttribute(Qt::WA_TranslucentBackground, true);
//设置无边框
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
//实例阴影shadow
GraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
//设置阴影距离
shadow->setOffset(0, 0);
//设置阴影颜色
shadow->setColor(QColor("#444444"));
//设置阴影圆角
shadow->setBlurRadius(30);
//给嵌套QWidget设置阴影
ui->widget_bg->setGraphicsEffect(shadow);
//给垂直布局器设置边距(此步很重要, 设置宽度为阴影的宽度)
ui->lay_bg->setMargin(24);
alt +回车 快速加头文件
scene 和view 的一点个人理解 scene.初始化给的位置参数,就view(0,0)对应的位置。如果想让
setAcceptedMouseButtons(Qt::NoButton);设置 item不接受鼠标事件,默认接收所有事件。
结构体转化为QByteArray,主要使用的是append()函数;
QByteArray转化为结构体,主要使用的data()函数。
在使用过程中,要注意类型的转化问题。
dropEvent中通过这种方式进行转换实现MimDate
const MimeDataDrogLine* drogMimDate=qobject_cast<const MimeDataDrogLine*>(event->mimeData());
在点击或者移动函数中通过继承QMimDate类实现对不兼容数据类型的定义。在继承中需要支持信号与槽机制。添加我们自己需要的数据类型作为成员变量
在点击事件中添加这个类型的对象,并给上边的数据类型赋值。用于后边函数访问。
const qreal lod = option->levelOfDetailFromTransform(painter->worldTransform());//鼠标缩放倍数。
transform().m11() 获得view的缩放比例
painter.setWindow(0,0,800,600)将窗口映射到屏幕上,坐标是映射关系,这时候如果手动改变窗口大小,变化后的窗口依然按照800,600 映射。
painter.setViewport(0,0,800,600);视口 用于在窗口显示的一个窗口, 具体讲解https://www.cnblogs.com/realid/archive/2013/05/05/3061312.html
所以setPos(50,50)是把item坐标点(0,0)设置为与scene坐标点(50,50)重合
先把QMainWindow的CentrolWidget使用setMouseTracking(true)开启移动监视。然后在把QMainWindow的setMouseTracking(true)开启监视。之后就一切正常了。
void Widget::keyPressEvent(QKeyEvent *event)
{
if(event->modifiers() == Qt::ControlModifier)
{
if(event->key() == Qt::Key_0)
{
qDebug()<<"I'm key press";
}
//if(event->isAutoRepeat()) return;
}
}
//以下是键盘释放事件
void Widget::keyReleaseEvent(QKeyEvent *event)
{
if(event->modifiers() == Qt::ControlModifier)
{
if(event->key() == Qt::Key_0)
{
qDebug()<<"I'm key release";
}
}
setRect(QRectF(0,0,(secondpointscene-oldpointScene).x(),(secondpointscene-oldpointScene).y()));
设置矩形时要以0点为起点设置矩形,这样才能保证位置的对应关系
setPos(oldpointScene);矩形放入SCene中的具体位置
事件过滤器
int dx = curPoint.x() - mousePoint.x();
int dy = curPoint.y() - mousePoint.y();
int rx = horizontalScrollBar()->value();
int ry = verticalScrollBar()->value();
int ax = rx - dx;
int ay = ry - dy;
horizontalScrollBar()->setValue(ax);
verticalScrollBar()->setValue(ay);
mousePoint.setX(curPoint.x());
mousePoint.setY(curPoint.y());
bool QWidget::underMouse() 如果在返回true,不在返回false
currentLine->move(0, event->pos().y() - currentLine->getFixWidth() / 2);
int fixI = qRound(i);
painter->setPen(graduationColor);
painter->drawLine(graduationStart, fixI, graduationEnd, fixI);
painter->save();
painter->rotate(-90);
painter->setPen(textColor);
painter->drawText(QRectF(-fixI - textWidth / 2.0f, 0, textWidth, textHeight), Qt::AlignCenter, QString::number(index));
painter->restore();
过滤器的使用 别忘了 setAttribute 开启过滤器;
m_tryagain->installEventFilter(this);
m_tryagain->setAttribute(Qt::WA_Hover,true);
HwProgressBar::eventFilter(QObject *target, QEvent *event)
{
if(state==ERRORINFO){
if(target==m_tryagain){
if(event->type()==QEvent::HoverEnter){
setCursor(Qt::PointingHandCursor);
}
if(event->type()==QEvent::HoverLeave){
setCursor(Qt::ArrowCursor);
}
if(event->type()==QEvent::MouseButtonPress){
qDebug()<<"请根据业务需求进行处理,此函数位置为"
<<"HwProgressBar::eventFilter(QObject *target, QEvent *event)";
}
}
}
return QWidget::eventFilter(target,event);
}
QSS文件加载
QFile qssFile(":/qss/lightLoose/HwProgressBarLight.qss");
if( qssFile.open(QFile::ReadOnly))
{
QString styleSheet = QLatin1String(qssFile.readAll());
this->setStyleSheet(styleSheet);
qssFile.close();
}
else
{
QMessageBox::warning(NULL, "warning", "Open failed", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
}
std::unordered_set<ReferenceLine*>方便插入刪除的容器
setWindowFlags(windowFlags() |Qt::FramelessWindowHint); 隐藏标题 第一个参数必须有
QString okandcanclestring=QString(R"(
QPushButton {
border-radius: 5px;
border-width: 1px;
margin: 0px;
padding: 0px;
font-size: %1px;
color: rgba(255,255,255,0.9);
background: rgb(78,78,78);
outline: none;
}
QPushButton:hover{
outline: none;
background: #4C88FF;
color: white;
text-decoration:underline;
}
)").arg(16);
加载字体
int fontId = QFontDatabase::addApplicationFont(":/font/Manrope-Bold.ttf");
if(fontId >= 0){
QString mysh = QFontDatabase::applicationFontFamilies(fontId).at(0);
QFont font(mysh);
setFont(font);
}
else{
qDebug() << "fontId:" << fontId << "加载失败";
}
setStyleSheet("EditMarcoDialog{background:#393939;\
border:1px solid red;\
border-radius: 5px;\
}");
font-family : Manrope;
border-radius: 5px;
border-width: 1px;
margin: 0px;
padding: 0px;
font-size: %1px;
color: rgba(255,255,255,0.9);
background: rgb(78,78,78);
outline: none;
设置默认按钮和状态
m_okButton->setDefault(true);
m_okButton->setFocus();
QPushButton:Focus{
outline: none;
background: #4C88FF;
color: white;
鼠标点击事件有可能被其他控件吃了
//设置抗锯齿,反走样。如果为false会有锯齿
painter.setRenderHint(QPainter::Antialiasing, true);
self.setWindowOpacity(0.93) # 设置窗口透明度
self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)# 隐藏边框
qreal lod = QStyleOptionGraphicsItem::levelOfDetailFromTransform(painter->worldTransform());
void EditMarcoDialog::mousePressEvent(QMouseEvent *event)
{
QWidget *child=nullptr;
child = childAt(event->pos());
if(child)
{
Pattern *patternTemp=nullptr;
patternTemp=qobject_cast<Pattern*>(child);// 这个函数转换成功返回指针,失败返回0
if(patternTemp){
qDebug()<<"void EditMarcoDialog::mousePressEvent(QMouseEvent *event) pattern";
m_selectedPixelType=patternTemp->getpixelType();
}
QLabel *color=nullptr;
color=qobject_cast<QLabel*>(child);
if(color){
m_selectedColor=QColor(color->objectName());
}
}
return QDialog::mousePressEvent(event);
}
加载字体文件
int fontId = QFontDatabase::addApplicationFont(":/font/Manrope-Bold.ttf");
if(fontId >= 0){
QString boldFont = QFontDatabase::applicationFontFamilies(fontId).at(0);
QFont font(boldFont);
}
else{
qDebug() << "fontId:" << fontId << "加载失败";
}
void EditMarcoDialog::mousePressEvent(QMouseEvent *event)
{
m_isMove = true;//移动之前xian
m_lastPos = event->globalPos()-pos();
QWidget *child=nullptr;
child = childAt(event->pos());
if(child)
{
Pattern *patternTemp=nullptr;
patternTemp = qobject_cast<Pattern*>(child);
if(patternTemp){
m_selectedPixelType=patternTemp->getPixelType();
} else {
QLabel *color = nullptr;
color = qobject_cast<QLabel*>(child);
if(color&&color->objectName()!= nullptr){
m_selectedColor = QColor(color->objectName());
}
}
}
return QDialog::mousePressEvent(event);
}
void EditMarcoDialog::mouseMoveEvent(QMouseEvent *event) {
if(m_isMove && (event->buttons() & Qt::LeftButton) && (event->globalPos() - m_lastPos).manhattanLength() > QApplication::startDragDistance())
{
move(event->globalPos() - m_lastPos);
m_lastPos = event->globalPos() - pos();
}
return QDialog::mouseMoveEvent(event);
}
void EditMarcoDialog::mouseReleaseEvent(QMouseEvent *event) {
Q_UNUSED(event)
m_isMove= false;
}
git 学习进程
git pull origin master
git add .
git status
git commit -m
git push origin test
c创建版本库
mkdir test
cd test
pwd
git init //将目录变成git可管理的仓库,执行后提示创建空的仓库
git diff 查看修改的内容
$ git log //查看版本库中日志,查看都有哪些版本信息
git reset --hard HEAD^ 回退到上一个版本 HEAD 表示当前版本
git reset HEAD <file> 可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reflog 记实录输入的命令
要查看远程库的信息,用git remote:
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
setAutoExclusive(true); QPushButton 同组排他属性
color1->setChecked(true);
color1->setDefault(true);
color1->setFocus();
color1 setCheckable()
const std::map<StyleType, std::pair<QString, Qt::BrushStyle>> StyleNameMap = {
{ StyleType::PIXEL_NO_TYPE, std::make_pair(QString("Null"), Qt::NoBrush) },
{ StyleType::PIXEL_DOT_CROSS, std::make_pair(QString("Dense"), Qt::Dense7Pattern) },
{ StyleType::PIXEL_DOT_HERRING_BONE, std::make_pair(QString("Hor"),Qt::HorPattern) },
{ StyleType::PIXEL_GRID_MAX, std::make_pair(QString("Ver"), Qt::VerPattern) },
{ StyleType::PIXEL_GRID_MEDIUM, std::make_pair(QString("Corss"), Qt::CrossPattern) },
{ StyleType::PIXEL_GRID_MIN, std::make_pair(QString("BDiag"), Qt::BDiagPattern) },
{ StyleType::PIXEL_LINE30_MAX, std::make_pair(QString("FDiag"), Qt::FDiagPattern) },
{ StyleType::PIXEL_LINE30_MEDIUM, std::make_pair(QString("DiagCross"), Qt::DiagCrossPattern) },
{ StyleType::PIXEL_LINE30_MIN, std::make_pair(QString("DiagCross"), Qt::DiagCrossPattern) }
};
typedef std::map<QString, QString> ColorMap;
const ColorMap ColorNameMap = []() {
static ColorMap colorMap;
if (colorMap.empty()) {
for (const auto &name : QColor::colorNames()) {
auto c = QColor(name);
colorMap[c.name()] = name;
}
}
return colorMap;
}();
this->setStyleSheet("QPushButton{background-color: " + m_color.name() + ";} " + buttonColorStyle);
connect只写类型不写变量名字
connect(dlg, SIGNAL(applyClick(StyleType, QColor)),this, SLOT(marcoChanged(StyleType, QColor)));
1、要想实现mouseMoveEvent,则需要在构造函数中添加setMouseTrack(true),直接得到监听事件。若是setMouseTrack(false),只有鼠标按下才会有mouseMove监听事件响应。
2、使用setMouseTracking(true)对鼠标进行监控(mouseMoveEvent(QMouseEvent event)),如果WidgetA有个子窗体WidgetB会占据WidgetA的绝大部分空间,那么当鼠标移动到WidgetB上时,WidgetA就会失去对鼠标的监控。
3、使用setAttribute( Qt::WA_Hover,true)也可以实现对鼠标的监控,相对于setMouseTracking(true)来说,它可以弥补鼠标事件被子窗体获取的问题:
auto patterArray = new PushButton*[tempVector->size()];创建动态数组
void Stuff::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
Q_UNUSED(option);
Q_UNUSED(widget);
qreal lod = QStyleOptionGraphicsItem::levelOfDetailFromTransform(painter->worldTransform());
QTransform tf;
qreal fixLod = 1.0;
if (lod > 1.0) {
fixLod = 1.0 / lod;
}
tf.scale(fixLod, fixLod);
m_brush.setTransform(tf);
painter->setPen(QPen(Qt::magenta, 1));
painter->setBrush(m_brush);
painter->drawRect(boundingRect());
}
setFocusPolicy ( Qt::FocusPolicy policy )设置获取焦点事件的方式(tab 键,点击)
超前定义解决方法
在头文件w中声明超前定义的类 class a ; 在。cpp文件中引用头文件;
// m_selectedPixelType = DialogArgs.at(m_type).first.at(0);
// m_selectedColor = DialogArgs.at(m_type).second.at(0);
explicit 防止隐式自动转换
QPushButton {
padding: 8px; //根据自己需求修改
text-align: right;
background-position: left;
background-image: url(:/icon.png);
background-repeat: repeat-no-repeat;
background-origin:content;
}
方法二
QPushButton {
text-align: left;
qproperty-icon: url(:/icon.png);
qproperty-iconSize: 24px 24px;
}
图标右文字左
QPushButton {
padding: 8px;
text-align: left;
background-position: right;
background-image: url(:/icon.png);
background-repeat: repeat-no-repeat;
background-origin:content;
}
图标上文字下
QPushButton {
padding: 5px;
min-height: 40px;
text-align: bottom;
background-position: top;
background-image: url(:/icon.png);
background-repeat: repeat-no-repeat;
background-origin:content;
}
图标下文字上
QPushButton {
padding: 5px;
min-height: 40px;
text-align: top;
background-position: bottom;
background-image: url(:/icon.png);
background-repeat: repeat-no-repeat;
background-origin:content;
}