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,自带边框。
Qt 设置背景图片3种方法(三种方法:QPalette调色板,paintEvent,QSS)
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以及其自己的样式表会影响背景图片的显示;
转载: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();
}
转载: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,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。
Qt 之自定义界面(窗体缩放-跨平台终极版)
Qt 之自定义界面(添加自定义标题栏)
QWidget添加滚动条
设置背景图片;
设置背景透明;
pB_Add->setStyleSheet("border-image: url(:/images/image_add.png);background:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);");
QFontMetrics fontWidth(lable_fileName->font());//得到每个字符的宽度
QString elideNote = fontWidth.elidedText(file.fileName(), Qt::ElideMiddle, FIX_WIDTH);
lable_fileName->setText(elideNote);
Qt::ElideMiddle表示省略号出现在中间,效果如下:
转载自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);
可能需要参考的代码:(寻找控件相对于界面的位置)
QPoint GlobalPoint(m_But->mapToGlobal(QPoint(0, 0)));
下面代码重写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);
}
}
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)));