Qt 常用代码

Qt 常用代码

窗体居中并绘制背景

#include <QDesktopWidget>
#include <QApplication>

setWindowFlags(windowFlags() & ~Qt::WindowMinMaxButtonsHint);         
setMinimumSize(LANCHERWIDGET_WIDTH ,LANCHERWIDGET_HEIGHT);            
setMaximumSize(LANCHERWIDGET_WIDTH ,LANCHERWIDGET_HEIGHT);            
setAutoFillBackground(true);                                          
setAttribute(Qt::WA_TranslucentBackground);                           
                                                                      
QDesktopWidget *deskdop = QApplication::desktop();                    
int startX = (deskdop->width() - LANCHERWIDGET_WIDTH)/2;              
int startY = (deskdop->height() - LANCHERWIDGET_HEIGHT)/2;            
setGeometry(startX, startY,LANCHERWIDGET_WIDTH,LANCHERWIDGET_HEIGHT); 
void XX::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter p(this);
    p.save();
    p.setRenderHint(QPainter::Antialiasing, true);
    p.drawPixmap(rect(),QPixmap(":/images/background.png"));
    p.restore();

}

调色板使用

setAutoFillBackground(true);
QPalette palette;
palette.setColor(QPalette::Background,Qt::green);
setPalette(palette);

鼠标移动事件

private:
    QPoint      last_mouse_position;
protected:
    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
void XX::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
    {
        last_mouse_position = event->globalPos();
    }
}

void XX::mouseMoveEvent(QMouseEvent* event)
{
    if (event->buttons() & Qt::LeftButton)
    {
        const QPoint position =  event->globalPos() - last_mouse_position;
        //qDebug()<<"POSY:"<<last_mouse_position<<""<<event->globalPos()<<" "<< position;
    }
}

void XX::mouseReleaseEvent(QMouseEvent* event)
{
    Q_UNUSED(event);
    //emit moveDoneSignal();
}

QLabel实现点击事件

QT添加qss文件和资源文件

QT自定义控件(Widget+QSS)

关于子类化QWidget后使用QSS不能生效的问题

Qt自定义QWidget控件设置QSS

  • 或者在指定文件夹里自行创建 xxx.qss,然后用类似于引用图片的方式引入qss文件。
  • 自定义窗体设置样式
  • 构造函数中
setAttribute(Qt::WA_StyledBackground,true);
  • 重写paintEvent函数,注意设置抗锯齿,否则窗体设置圆角时有锯齿
void XX::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QStyleOption opt;
    opt.init(this);
    QPainter pt(this);
    pt.setRenderHint(QPainter::Antialiasing, true);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &pt, this);
    QWidget::paintEvent(event);
//    QPainter p(this);
//    p.save();
//    p.setRenderHint(QPainter::Antialiasing, true);
//    p.drawPixmap(rect(),QPixmap(":/img/loginbkg.png"));
//    p.restore();
}

Qt控件的使用

添加阴影与圆角

Qt 给顶层窗口和子控件添加阴影和圆角

Qt 如何实现窗口的阴影效果

弹窗

Qt QMessageBox用法详解

Qt中QMessageBox的用法---看这一篇就够了

智能指针

Qt 之 智能指针汇总

设置样式格式

//设置样式表
QStringList list;
list << "#titleBar{background:#BBBBBB;}";
list << "#titleBar{border-top-left-radius:8px;border-top-right-radius:8px;}";
list << "#widgetMain{border:2px solid #BBBBBB;background:#FFFFFF;}";
//list << "#widgetMain{border-bottom-left-radius:8px;border-bottom-right-radius:8px;}";
this->setStyleSheet(list.join(""));

设置背景图片自适应大小

this->setObjectName("loginPage");
this->setStyleSheet("QWidget#loginPage{border-image:url(:/core/images/app/login_background.png);}");
QComboBox {
    border: 1px solid #aaaaaa;
    border-radius: 2px;
    padding: 1px 18px 1px 3px;
    font-family: "Source Han Sans CN Regular";
    font-size: 13px;
    height: 28px;
}

QComboBox:editable {
    background: white;
}


QComboBox QAbstractItemView::item {
    height: 28px;   /* 项的高度(设置pComboBox->setView(new QListView(this));后,该项才起作用) */
}

/* 设置为可编辑editable时,点击下拉框的样式 */
QComboBox::drop-down:editable:on {
    background: #dadada;
}

/* 设置为非编辑!editable时,下拉框的样式 */
QComboBox::drop-down:!editable {
    background: #dadada;
}

/* 设置为非编辑!editable时,点击下拉框的样式 */
QComboBox::drop-down:!editable:on {
    background: #dadada;
}

/* 点击QComboBox */
QComboBox:on {
}


/* 下拉框样式 */
QComboBox::drop-down {
    subcontrol-origin: padding;   /* 子控件在父元素中的原点矩形。如果未指定此属性,则默认为padding。 */
    subcontrol-position: top right;   /* 下拉框的位置(右上) */
    width: 15px;   /* 下拉框的宽度 */

    border-left-width: 1px;   /* 下拉框的左边界线宽度 */
    border-left-color: darkgray;   /* 下拉框的左边界线颜色 */
    border-left-style: solid;   /* 下拉框的左边界线为实线 */
    border-top-right-radius: 3px;   /* 下拉框的右上边界线的圆角半径(应和整个QComboBox右上边界线的圆角半径一致) */
    border-bottom-right-radius: 3px;   /* 同上 */
}

 /* 越过下拉框样式 */

 QComboBox::drop-down:hover {

   background: yellow;

 }

 QComboBox::down-arrow {
   border-image: url(:/assets/imges/down_arrow.png);
  width: 28px;
  background: transparent;
  padding: 5px 0px 5px 0px;

 }


 QComboBox::down-arrow:on {
  border-image: url(:/assets/imges/down_up.png); /* 显示上拉箭头 */
 } 
  • Button样式
QPushButton[class=RouterBtnType1]{
    background: #FFFFFF;
    border-radius: 2px;
/*    border: 1px solid  rgba(0,0,0,0.15);*/
    border: 1px solid  #aaaaaa;
    font-family: "Source Han Sans CN Medium";
    font-size: 13px;
    height: 28px;
    color: #333333;
}

QPushButton[class=RouterBtnType1]:hover{
    border: 1px solid #4CACFD;
    color: #4CACFD;
}

QPushButton[class=RouterBtnType1]:pressed{
    background: #4CACFD;
    color: #FFFFFF;
}

QPushButton[class=RouterBtnType2]{
    background: #3f9dfd;
    border-radius: 4px;
/*    border: 1px solid rgba(0,0,0,0.15);*/
    border: none;
    height: 30px;
    font-size: 13px;
    font-family: "Source Han Sans CN Medium";
    color: #FFFFFF;
}


QPushButton[class=RouterBtnType2]:hover{
    background: #67b2ff;
}

QPushButton[class=RouterBtnType2]:pressed{
    background: #3a8de4;
}
QPushButton[class=RouterBtnType2]:disabled{
    background: #dadada;
    color: #aaaaaa;
}
  • QLineEdit
QLineEdit{
    border: 1px solid #aaaaaa;
    border-radius: 2px;
    font-family: "Source Han Sans CN Regular";
    font-size: 13px;
/*    width: 200px;*/
    height: 28px;
}

#ifndef COMMONHELPER_H
#define COMMONHELPER_H

#include <QFile>
//#include <QApplication>
#include <QWidget>
#include <QPixmap>
#include <QLabel>
#include <QStyle>


class CommonHelper
{
public:
    CommonHelper();

public:
    static void setStyle(QWidget* wnd,const QString &style) {
        if(!wnd) return;
        QFile qss(style);
        qss.open(QFile::ReadOnly);
        wnd->setStyleSheet(qss.readAll());
        qss.close();
    }

    static void setLabelIcon(QLabel* lab, QString url, int size){
        if(!lab) return;
        QPixmap pixmap = QPixmap::fromImage(QImage(url));
        QPixmap fitpixmap = pixmap.scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
        lab->setScaledContents(true);
        lab->setPixmap(fitpixmap);
    }

    static void updateWidget(QWidget* w){
        if(!w) return;
        w->style()->unpolish(w);
        w->style()->polish(w);
        w->update();
    }


};

#endif // COMMONHELPER_H

设置滑动条

//滑动条样式表
QString  scrollBarStyle = QString(
    "QScrollBar{background:transparent; width:10px; margin:0px 0px 0px 0px;}"
    "QScrollBar::handle{background:rgba(63, 64, 65, 200); border:0px; border-radius:5px; margin:0px 0px 0px 0px;}"
    "QScrollBar::handle:hover{background:lightgray;}"
    "QScrollBar::handle:pressed{background:rgba(200, 200, 200, 255);}"
    "QScrollBar::sub-page{background:transparent;}"
    "QScrollBar::add-page{background:transparent;}"
    "QScrollBar::up-arrow{background:transparent;}"
    "QScrollBar::down-arrow{background:transparent;}"
    "QScrollBar::sub-line{background:transparent;}"
    "QScrollBar::add-line{background:transparent;}"
);

//滑动条
QScrollBar *scrollBar = new QScrollBar(m_listView);
scrollBar->setStyleSheet(scrollBarStyle);
m_listView->setVerticalScrollBar(scrollBar);
m_listView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
QScrollBar{background:transparent; width:10px; margin:0px 0px 0px 0px;}
QScrollBar::handle{background:rgba(63, 64, 65, 200); border:0px; border-radius:5px; margin:0px 0px 0px 0px;}
QScrollBar::handle:hover{background:lightgray;}
QScrollBar::handle:pressed{background:rgba(200, 200, 200, 255);}
QScrollBar::sub-page{background:transparent;}
QScrollBar::add-page{background:transparent;}
QScrollBar::up-arrow{background:transparent;}
QScrollBar::down-arrow{background:transparent;}
QScrollBar::sub-line{background:transparent;}
QScrollBar::add-line{background:transparent;}

添加滚动区域

//主布局
QVBoxLayout* vMainBox = new QVBoxLayout();
vMainBox->addWidget(topContainer);
vMainBox->addWidget(signalStatusWidget);
vMainBox->addWidget(routerConfWidget);
vMainBox->setMargin(0);
vMainBox->setSpacing(SHADOW_WIDTH);
vMainBox->setContentsMargins(SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH);

QWidget * mainContainer = new QWidget(this);
mainContainer->setObjectName("mainContainer");
mainContainer->setLayout(vMainBox);

QScrollArea *scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(mainContainer);

QHBoxLayout *hMainLayout = new QHBoxLayout;
hMainLayout->addWidget(scrollArea);
hMainLayout->setMargin(0);
hMainLayout->setSpacing(0);
hMainLayout->setContentsMargins(0, 0, 0, 0);
this->setLayout(hMainLayout);

设置分隔区域

QScrollArea *scrollArea = new QScrollArea(this);
scrollArea->setObjectName("FancyTabScrollArea");
scrollArea->setWidget(m_modesStackContainer);
scrollArea->setWidgetResizable(true);

m_vSplitter = new QSplitter(Qt::Vertical, this);
m_vSplitter->addWidget(scrollArea);
m_vSplitter->addWidget(m_statusWidget);
m_vSplitter->setChildrenCollapsible(false);
m_statusWidget->setMinimumHeight(CCSTATUSWIDGET_MIN_HEIGHT);
m_vSplitter->setSizes(QList<int>{9999, 1});
m_splitterList = m_vSplitter->sizes();

字体加载

  • 方式1:
int loadedFontID = QFontDatabase::addApplicationFont(":/assets/fonts/SourceHanSansCN-Medium.ttf");
QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID);
if (!loadedFontFamilies.empty())
{
    QString sansCNFamily = loadedFontFamilies.at(0);
    qDebug() << " sansCNFamily " << sansCNFamily;
    QFont defaultFont = app.font();
    defaultFont.setFamily(sansCNFamily);

    //设置字体大小格式为pixel,字体占用固定像素。相同像素的大小屏,不会发生字体遮挡现象
    defaultFont.setPixelSize(13);
    app.setFont(defaultFont);
}
  • 方式2:
void loadFonts()
{
    const QString creatorPath = QCoreApplication::applicationDirPath();
    QString dir = creatorPath + QLatin1String("/../share/fonts");

    const QFileInfoList fonts = QDir(dir).entryInfoList(QStringList("*.ttf"), QDir::Files);
    for (const QFileInfo &fileInfo : fonts)
    {
        QFontDatabase::addApplicationFont(fileInfo.absoluteFilePath());
        qDebug() << "fileInfo.absoluteFilePath() " << fileInfo.absoluteFilePath();
    }
}

字体与颜色设置

QFont defaultFont = app.font();
defaultFont.setFamily("Source Han Sans CN Regular");
defaultFont.setPixelSize(13);
app.setFont(defaultFont);

QPalette defaultPalette = app.palette();
defaultPalette.setColor(QPalette::WindowText, QColor(51,51,51));
app.setPalette(defaultPalette);

添加阴影

#include <QGraphicsDropShadowEffect>

#define SHADOW_WIDTH  15

void XXWidget::addShadow(QWidget *w)
{
    //设置具体阴影
    QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(w);
    // 阴影偏移
    shadowEffect->setOffset(0, 0);
    // 阴影颜色;
    shadowEffect->setColor(QColor(200, 200, 200, 220));
    // 阴影半径;
    shadowEffect->setBlurRadius(SHADOW_WIDTH);
    // 给窗口设置上当前的阴影效果;
    w->setGraphicsEffect(shadowEffect);

}


topContainer 布局 vMainBox->setContentsMargins(15, 10, 15, 10);
topContainer 颜色 #FFFFFF

addShadow(topContainer);

QCheckBox样式

QCheckBox {
    spacing: 5px;
}

QCheckBox::indicator {
    width: 18px;
    height: 18px;
}

QCheckBox::indicator:unchecked {
    image: url(:/assets/imges/checkbox_unchecked.png);
}


QCheckBox::indicator:checked {
    image: url(:/assets/imges/checkbox_checked.png);
}

对话框去掉问号

setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

固定窗口大小
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint | Qt::MSWindowsFixedSizeDialogHint);

网格布局

#include <QGridLayout>

QWidget* topWidget = new QWidget(this);
QWidget* bottomWidget = new QWidget(this)
QGridLayout*  gridBox = new QGridLayout(t
gridBox->addWidget(topWidget, 0, 0, 1, 5)
gridBox->addWidget(bottomWidget, 5, 0, 1,
gridBox->setMargin(0);
int margin = 30;
gridBox->setContentsMargins(margin, margi
gridBox->setSpacing(20);
this->setLayout(gridBox);

QGraphicsView画布拖动,缩放

double  scale_;
QPointF startPos_;
qreal   scaleValue_;
bool isMove_;


void MyCanvasView::wheelEvent(QWheelEvent *event)
{
    if (event->modifiers() == Qt::CTRL)
    {
        //按住ctrl键 可以放大缩小
        if((event->delta() > 0)&&(scale_ >= 50))//最大放大到原始的50倍
        {
            return;
        }
        else if((event->delta() < 0)&&(scale_ <= 0.01))//缩小到自适应大小之后就不继续缩小
        {
            return;//重置大小和位置,使之自适应控件窗口大小
        }
        else
        {
            // 当前放缩倍数;
            qreal scaleFactor = this->matrix().m11();
            scale_ = scaleFactor;

            int wheelDeltaValue = event->delta();
            // 向上滚动,放大;
            if (wheelDeltaValue > 0)
            {
                this->scale(1.2, 1.2);
            }
            else
            {
                // 向下滚动,缩小;
                this->scale(1.0 / 1.2, 1.0 / 1.2);
            }
            update();
        }

        return;
    }

    QGraphicsView::wheelEvent(event);

}

void MyCanvasView::mousePressEvent(QMouseEvent  *event)
{
    if(event->button()== Qt::LeftButton &&  event->modifiers() == Qt::CTRL)
    {
        startPos_ = event->pos();//鼠标左击时,获取当前鼠标在图片中的坐标,
        isMove_ = true;          //标记鼠标左键被按下
        viewport()->setCursor(Qt::PointingHandCursor);
        return;
    }
    QGraphicsView::mousePressEvent(event);
}

void MyCanvasView::mouseMoveEvent(QMouseEvent  *event)
{
    if(isMove_ &&  event->modifiers() == Qt::CTRL )
    {

        auto hBar = horizontalScrollBar();
        auto vBar = verticalScrollBar();
        auto delta = event->pos() - startPos_;
        startPos_ = event->pos();
        hBar->setValue(hBar->value() - delta.x());
        vBar->setValue(vBar->value() - delta.y());

        return;
    }
    QGraphicsView::mouseMoveEvent(event);
}

void MyCanvasView::mouseReleaseEvent(QMouseEvent  *event)
{
    viewport()->setCursor(Qt::ArrowCursor);
    isMove_ = false;//标记鼠标左键已经抬起
    QGraphicsView::mouseReleaseEvent(event);
}

设置程序图标

  • 其中 app.rc
IDI_ICON1               ICON    DISCARDABLE     "app.ico"
  • 然后在CMakeLists.txt文件中将rc文件追加到源文件中:
if (WIN32)
    list(APPEND DIR_LIB_SRCS app.rc)
endif()

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值