Qt 常用控件使用方法总结

1. QWidget相关

1.1 QWidget设置背景色

1.1.1QWidget设置背景色

1.1.2 QWidget设置边框

1)使用QPainter在paintEvent事件处理函数中沿着QWidget窗口边缘画出矩形。

		QRectF rectangle(0, 0, FIX_WIDTH, FIX_HEIGHT);
		painter.drawRoundedRect(rectangle, 5, 5);

2)使用样式表:setStyleSheet(QString::fromUtf8(“border:1px solid red”));

border-top-left-radius 设置左上角圆角;
border-top-right-radius 设置右上角圆角;
border-bottom-left-radius 设置左下角圆角;
border-bottom-right-radius 设置右下角圆角;
border-radius 设置四个角圆角;

3)使用QFrame代替QWidget,QFrame继承自QWidget,自带边框。

1.1.3 QWidget设置背景图片

Qt 设置背景图片3种方法(三种方法:QPalette调色板,paintEvent,QSS)

1.1.4 为子Widget设置背景图片

  QWidget *widget = new QWidget();  
    widget->setAutoFillBackground(true); // 这句要加上, 否则可能显示不出背景图.  
    QPalette palette = widget->palette();  
    palette.setBrush(QPalette::Window,  
                     QBrush(QPixmap("1.png").scaled( // 缩放背景图.  
                             widget->size(),  
                            Qt::IgnoreAspectRatio,  
                            Qt::SmoothTransformation))); // 使用平滑的缩放方式  
    widget->setPalette(palette); // 至此, 已给widget加上了背景图.  

注意:测试发现使用此种方式为子Widget设置背景图片时,父Widget以及其自己的样式表会影响背景图片的显示;

1.2 QWidget自定义标题栏

1.2.1 隐藏标题栏后,实现窗体拖动

转载:Qt隐藏窗口标题栏并解决无法拖动窗口问题
隐藏标题栏后窗体是无法拖动的,这个时候就需要重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent。核心代码如下:
添加成员变量:

private:
    QPoint m_lastPos;
void mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->globalPos();
}
void mouseMoveEvent(QMouseEvent *event)
{
    this->move(this->x() + (event->globalX() - m_lastPos.x()),
               this->y() + (event->globalY() - m_lastPos.y()));
    m_lastPos = event->globalPos();
}
void mouseReleaseEvent(QMouseEvent *event)
{
    // 其实这里的mouseReleaseEvent函数可以不用重写
    m_lastPos = event->globalPos();
}

1.2.2 隐藏标题栏后,实现自定义拖拽放大缩小界面

转载:Qt 之自定义界面(窗体缩放)
首先,设置无边框,用于实现自定义标题栏。

// 设置无边框
setWindowFlags(Qt::FramelessWindowHint);

// 背景透明
setAttribute(Qt::WA_TranslucentBackground, true);

包含头文件与所需要的库。

#ifdef Q_OS_WIN
#include 
#include 
#endif

使用nativeEvent进行窗体缩放。

注意: m_nBorder表示鼠标位于边框缩放范围的宽度,可以设置为5。

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    Q_UNUSED(eventType)

    MSG *param = static_cast<MSG *>(message);

    switch (param->message)
    {
    case WM_NCHITTEST:
    {
        int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();
        int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();

        // 如果鼠标位于子控件上,则不进行处理
        if (childAt(nX, nY) != NULL)
            return QWidget::nativeEvent(eventType, message, result);

        *result = HTCAPTION;

        // 鼠标区域位于窗体边框,进行缩放
        if ((nX > 0) && (nX < m_nBorder))
            *result = HTLEFT;

        if ((nX > this->width() - m_nBorder) && (nX < this->width()))
            *result = HTRIGHT;

        if ((nY > 0) && (nY < m_nBorder))
            *result = HTTOP;

        if ((nY > this->height() - m_nBorder) && (nY < this->height()))
            *result = HTBOTTOM;

        if ((nX > 0) && (nX < m_nBorder) && (nY > 0)
                && (nY < m_nBorder))
            *result = HTTOPLEFT;

        if ((nX > this->width() - m_nBorder) && (nX < this->width())
                && (nY > 0) && (nY < m_nBorder))
            *result = HTTOPRIGHT;

        if ((nX > 0) && (nX < m_nBorder)
                && (nY > this->height() - m_nBorder) && (nY < this->height()))
            *result = HTBOTTOMLEFT;

        if ((nX > this->width() - m_nBorder) && (nX < this->width())
                && (nY > this->height() - m_nBorder) && (nY < this->height()))
            *result = HTBOTTOMRIGHT;

        return true;
    }
    }

    return QWidget::nativeEvent(eventType, message, result);
}

接口说明
Qt5与Qt4其中的一个区别就是用nativeEvent代替了winEvent。

nativeEvent主要用于进程间通信-消息传递。使用这种方式后,窗体就可以随意缩放了,而且可以去掉标题栏中控制界面移动的代码 - 在mousePressEvent中使用SendMessage来进行移动。

当然,这种实现只能在Windows下使用,因为用的是Win API,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。

1.2.3 跨平台自定义窗口放大缩小实现

Qt 之自定义界面(窗体缩放-跨平台终极版)

1.2.4 添加自定义标题栏

Qt 之自定义界面(添加自定义标题栏)

1.3 为QWidget添加滚动条

QWidget添加滚动条

2.QPushButton

2.1 QPushButtong 常用样式表

设置背景图片;
设置背景透明;

pB_Add->setStyleSheet("border-image: url(:/images/image_add.png);background:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);");

3. QLabel

3.1 处理QLabel中文字太长,以省略号方式展示

QFontMetrics fontWidth(lable_fileName->font());//得到每个字符的宽度
QString elideNote = fontWidth.elidedText(file.fileName(), Qt::ElideMiddle, FIX_WIDTH);
lable_fileName->setText(elideNote);

Qt::ElideMiddle表示省略号出现在中间,效果如下:
在这里插入图片描述

3.2 QLabel自动换行

转载自https://blog.csdn.net/weixin_47142322/article/details/105955161
1、设置QLable属性(二选一):

①代码实现:

    ui->label->setGeometry(QRect(25, 2, 75, 35));     // 设置QLabel框大小
    ui->label->setWordWrap(true);                     // true:自动换行
    ui->label->setAlignment(Qt::AlignVCenter);        // 对齐方式

②或者在Qt Designer中设置:
在这里插入图片描述
2、(可选)在合适位置插入空格,实现换行:

    QString str = "changeline";
    str.insert(6, " ");                                // 在'e'后插入空格
    ui->label->setText(str);

4. QSlider

4.1 使用QSlider实现音量条

可能需要参考的代码:(寻找控件相对于界面的位置)
QPoint GlobalPoint(m_But->mapToGlobal(QPoint(0, 0)));

4.2 重写Slider,实现自定义Slider

下面代码重写QSlider,实现按压鼠标将滑块移动对应位置,并留出是否可让用户使用鼠标移动滑块接口;

class MySlider : public QSlider
{
public:
    MySlider(QWidget *parent = nullptr);
    ~MySlider();
    void isAllowMove(bool flag);
protected:
    void mousePressEvent(QMouseEvent *ev);//重写鼠标按压事件
private:
    void initUI();
    bool moveFlag = true;
};
MySlider::MySlider(QWidget *parent):QSlider (parent)
{
    initUI();
    isAllowMove(true); //禁止用户操作
}
MySlider::~MySlider()
{

}
void MySlider::isAllowMove(bool flag)
{
    moveFlag = flag;
}
void MySlider::mousePressEvent(QMouseEvent *ev)
{
    if(moveFlag){
        //获取当前点击位置
        int currentX = ev->pos().x();
        //获取当前点击的位置占整个Slider的百分比
        double per = currentX *1.0 /this->width();
        //利用算得的百分比得到具体数字
        int value = per*(this->maximum() - this->minimum()) + this->minimum();

        qDebug() << value;
        //设定滑动条位置
        this->setValue(value);
        //滑动条移动事件等事件也用到了mousePressEvent,加这句话是为了不对其产生影响,是的Slider能正常相应其他鼠标事件
        QSlider::mousePressEvent(ev);
    }
}

4.3 QSlider 样式表

4.3.1 在设计师界面添加的样式表

在这里插入图片描述

5. QProgressBar

5.1 QProgressBar以小数方式显示进度

ui.progressBar->setValue(num);
float dProgress = num / (float)timeline->info.video_length * 100;
ui.progressBar->setFormat(QString::fromLocal8Bit("%1%").arg(QString::number(dProgress, 'f', 1)));

你可能感兴趣的:(#,Qt界面布局,qt)