Qt界面设计总结

article/2025/9/15 3:51:24

1. 子窗体或控件,重写paintEvent事件,画边框、背景、文字、图片效果比较好。用paintEvent 事件画边框,用QPalette设置背景。

// 画边框

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing, true);

    painter.setPen(QPen(QColor(225,70,56), 2));

//    painter.setBrush(QColor(16,62,81));   // 也可设置背景,有时效果不好

    painter.drawRoundedRect(rect(), 5.0, 5.0);

// 设置背景

    QPalette pal = palette();

    pal.setBrush(QPalette::Window, QColor(16,62,81));

    setPalette(pal);

    setAutoFillBackground(true);

2. 继承QDialog,想让对话框以模态运行,使用exec(),继承时使用setWindowFlags()后则达不到模态的效果。不知道原因。

3. QStringList 输出

QStringList m_strLang << "English"

                                          << "Chinese";

qDebug("set language: %s", m_strLang.at(0).toLocal8Bit().constData());

4. QStringList 使用注意

    QStringList strDateformatList;

    strDateformatList

            << m_strMonth + "-" + m_strDay + "-" + m_strYear

            << m_strDay + "-" + m_strMonth + "-" + m_strYear

            << m_strYear + "-" + m_strMonth + "-" + m_strDay

            ;

如果strDateformatList 在生命周期内多次调用,则会多次插入字符串,使得字符串重复,这不是我们想要的。那就定义为局部变量,每次会重新赋值,达到更新的目的。

5.需要动态重新的页面可以在showEvent函数中重新。

6. 用paintEvent或用调色板为QWidget填充背景时,需要加上setAutoFillBackground(true);语句,否则没效果。

7. 想使弹出的窗口为圆角,用paintEvent画圆角矩形,但四个直角仍然存在,不美观。可以把背景设为透明,用paintEvent画出想要的背景,因为四个角没有画上背景,是透明的,所以看不见。

     // 设置背景为透明 (构造函数中)

    QPalette pal = palette();

    pal.setBrush(QPalette::Window, QColor(255, 255, 255, 0));

    setPalette(pal);

    setAutoFillBackground(true);

    // 画背景和边框 (paintEvent函数中)

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing, true);

    painter.setPen(QPen(QColor(225,70,56), 2));

    painter.setBrush(QColor(16,62,81));

    painter.drawRoundedRect(rect(), 5.0, 5.0);

8. Qt::Key_Enter、Qt::Key_Reture

Qt::Key_Enter对应小键盘的Enter键

Qt::Key_Return对应大键盘的Enter键

9. 事件过滤。窗口部件的事件到达目的地之前提前获取并处理相关事件,实现个性化的处理。

我在QLabel对象中放入两个QPushButton对象和两个QLabel对象,QPushButton实现值的调节,其中一个QLabel对象用于显示值,一个QLabel对象用于显示标题。类似SpinBox。在多个SpinBox上点击实现焦点切换,当鼠标点到QPushButton上时,QPushButton处理了mousePressEvent事件,所以无法实现焦点切换。为两个QPushButton对象安装事件过滤器,然后在其父部件中处理eventFilter函数

m_btnLeft->installEventFilter(this);

m_btnRight->installEventFilter(this);

//安装事件过滤器后,传给m_btnLeft、m_btnRight的事件会首先发送给eventFilter函数

bool ESpinBoxItem::eventFilter(QObject*obj,QEvent*ev)

{

if(obj == m_btnLeft || obj == m_btnRight)

{

if(ev->type() == QEvent::MouseButtonPress)

{

emit sign_spinBoxPressed(m_nItem);

return true; // 不传给目标对象处理

}

}

return false; // 不处理的事件则传给目标对象处理

}

10. 拍照动画

使用QTimeLine和QGraphicsPixmapItem对象,当时间线帧改变时,设置QGraphicsPixmapItem的位置,实现动画效果。

// 在QGraphicsView构造函数中

// take photo animation

    m_timerAnimation = new QTimeLine(900);

    m_timerAnimation->setCurveShape(QTimeLine::LinearCurve);

    m_timerAnimation->setFrameRange(0, 240);

    m_pixmapUpAnimation = QPixmap(":/images/animation.png");

    m_pixmapDownAnimation = QPixmap(":/images/animation.png");

    m_upPixmapItem = new QGraphicsPixmapItem;

    m_downPixmapItem = new QGraphicsPixmapItem;

    m_upPixmapItem->setZValue(4);

    m_downPixmapItem->setZValue(4);

    m_upPixmapItem->setPos(0, 0);            // 左上角为原点

    m_downPixmapItem->setPos(0, 240);

    scene()->addItem(m_upPixmapItem);

    scene()->addItem(m_downPixmapItem);

    m_upPixmapItem->hide();

    m_downPixmapItem->hide();

    connect(m_timerAnimation, SIGNAL(frameChanged(int)), this, SLOT(slot_playAnimation(int)));

// 槽函数

void EGraphicsView::slot_playAnimation(int nFrame)

{

    m_upPixmapItem->show();

    m_downPixmapItem->show();

    qDebug("nFrame: %d", nFrame);

    if(nFrame < 120)

    {

        m_upPixmapItem->setPixmap(m_pixmapUpAnimation.scaled(320, nFrame));

        m_downPixmapItem->setPixmap(m_pixmapDownAnimation.scaled(320, nFrame));

        m_downPixmapItem->setPos(0, 240 - nFrame);

    }

    else

    {

        m_upPixmapItem->setPixmap(m_pixmapUpAnimation.scaled(320, 240 - nFrame));

        m_downPixmapItem->setPixmap(m_pixmapDownAnimation.scaled(320, 240 - nFrame));

        m_downPixmapItem->setPos(0, nFrame);

    }

}

11.在移动设备上使用渐变或使用渐变的图片时,会出现条纹状,达不到效果。在初始化QApplication对像前调用下面的语句则可以达到效果:

QApplication::setColorSpec(QApplication::ManyColor); //the right choice for applications that use thousands of colors

QApplication app(argc, argv,  QApplication::GuiServer );

12.用setStyleSheet设置背景图片

m_labelButton->setStyleSheet("background-image: url(:images/shutdown/slider.png); background-repeat: no-repeat;"); //注意,不加background-repeat: no-repeat可能会出现透视,很丑。QLabel对象可用setPixmap设置象素图。

13.使对话框圆角

    //构造函数中

    setAutoFillBackground(true);

    QPalette pal = palette();

    pal.setColor(QPalette::Window, QColor(0, 0, 0, 0));

    setPalette(pal);

    //paintEvent函数中

   QPainter painter(this);

   painter.setRenderHint(QPainter::Antialiasing,true);

   painter.setPen(QPen(Qt::red,2));

   painter.setBrush(QColor(16,62,81));

   painter.drawRoundedRect(rect(),5.0,5.0);

// 圆角处有杂色,原因不祥

14. 对某些默认事件的处理修改

正常情况下,按下Tab键,被QWidget看成是去移动键盘焦点,但少数窗口部件需要自行解释。

bool MyClass::event(QEvent *e)

{

         if(e->type() == QEvent::KeyPress)

         {

                 QKeyEvent *ke = (QKeyEvent *)e;

                 if(ke->key() == Qt::Key_Tab)

                  {

                            //这里是特定的Tab处理

                            k->accept();

                            return TRUE;

                  }

         }

         else if(e->type()  >= QEvent::User)

         {

                 // 这里是自定义事件处理

                 return TRUE;

          }

          QWidget::event(e);

}

   15.QLabel继承QFrame,有QFrame的特性。如setFrameStyle(int)可设置QLabel的FrameStyle(框架类型)

FrameStyle有两种:

a.第一种是frameshape:

有以下几种类型:

Constant

Value

Description

QFrame::NoFrame

0

QFrame draws nothing

QFrame::Box

0x0001

QFrame draws a box around its contents

QFrame::Panel

0x0002

QFrame draws a panel to make the contents appear raised or sunken

QFrame::StyledPanel

0x0006

draws a rectangular panel with a look that depends on the current GUI style. It can be raised or sunken.

QFrame::HLine

0x0004

QFrame draws a horizontal line that frames nothing (useful as separator)

QFrame::VLine

0x0005

QFrame draws a vertical line that frames nothing (useful as separator)

QFrame::WinPanel

0x0003

draws a rectangular panel that can be raised or sunken like those in Windows 95. Specifying this shape sets the line width to 2 pixels. WinPanel is provided for compatibility. For GUI style independence we recommend using StyledPanel instead.

b.第二种是frameshadow

有以下几种类型:

Constant

Value

Description

QFrame::Plain

0x0010

the frame and contents appear level with the surroundings; draws using the paletteQPalette::WindowTextcolor (without any 3D effect)

QFrame::Raised

0x0020

the frame and contents appear raised; draws a 3D raised line using the light and dark colors of the current color group

QFrame::Sunken

0x0030

the frame and contents appear sunken; draws a 3D sunken line using the light and dark colors of the current color group

组合值的效果图:

15.几种位置信息

x()、y()、pos()函数都是获得整个窗体左上角的坐标位置。需frameGeometry与geometry相对应,frameGemometry()是获得整个窗体的左上顶点和长、宽值,需geometry()函数获得的是窗体内中央域的左上顶点坐标以及长、宽值。直接调用width()和height()函数获得的是中央区域的长和宽的值。还有两个函数rect()、size(),调用它们获得的结果也都是对于窗体的中央区域而言的。size()获得的是窗体中央区域的长、宽值,rect()与geometry()一样返回一个QRect对象。其中,两个函数获得的长宽、值是一样的,都是窗体中央区域的长、宽值,只是左上顶点的坐标值不一样,geometry()获得的左上角顶点坐标是相对于父窗体而言的坐标,,而rect()获得的左上角顶点坐标始终为(0, 0)。

效果图:

窗体在左上角时:

16.几种输入对话框。

a.获取文本对话框

QString strName =QInputDialog::getText(this,tr("User Name"),tr("Please Input New Name:"),QLineEdit::Normal,m_labelName->text(),&ok);

b.获取项对话框

QStringList list;

list<<tr("男")<<tr("女");

QStringstrSex=QInputDialog::getItem(this,tr("User Sex"),tr("Please Select Sex:"),list,0,false,&ok);

c.获取整数对话框

bool ok;

int nAge = QInputDialog::getInteger(this, tr("User Age"), tr("Please Input Age:"), m_labelAge->text().toInt(), 18, 30, 1, &ok);

if(ok)

{

m_labelAge->setText(QString(tr("%1").arg(nAge)));

}

d.获得双精度对话框

boolok;

double nHeight = QInputDialog::getDouble(this, tr("User Height"), tr("Please Input Height:"), m_labelHeight->text().toDouble(), 160.5, 270.5, 1, &ok);

if(ok)

{

m_labelHeight->setText(QString(tr("%1").arg(nHeight)));

}

17.自定义QMessageBox

    QMessageBox customMsgBox;

customMsgBox.setWindowTitle("Custom message box");

QPushButton *lockButton = customMsgBox.addButton(tr("Lock"), QMessageBox::ActionRole);

QPushButton *unlockButton = customMsgBox.addButton(tr("Unlock"), QMessageBox::ActionRole);

QPushButton *cancelButton = customMsgBox.addButton(QMessageBox::Cancel);

customMsgBox.setIconPixmap(QPixmap(":/images/1.png"));

customMsgBox.setText(tr("This is a custom message box"));

customMsgBox.exec();

if(customMsgBox.clickedButton() == lockButton)

{

m_labelMessage->setText("Custom MessageBox button / lock");

}

else if(customMsgBox.clickedButton() == unlockButton)

{

m_labelMessage->setText("Custom MessageBox button / unlock");

}

else if(customMsgBox.clickedButton() == cancelButton)

{

m_labelMessage->setText("Custom MessageBox button / Cancel");

}

效果图:

定义好的MessageBox

QMessageBox::question

QMessageBox::information

QMessageBox::warning

QMessageBox::critical

QMessageBox::about

QMessageBox::aboutQt

18.在编写程序时,初始化窗体时最好不要使用setGeometry()函数,而用resize()和move()函数代替,因为使用setGeometry()会导致窗体show()之后在错误 的位置上停留很短暂的一段时间,带来闪烁现象。

19.提示错误:E:\vm_shared\study\graphicsview\debug\moc_navibar.cpp:39: error: `staticMetaObject' is not a member of `QGraphicsRectItem'

错误原因:因为QGraphicsRectItem不是QObject的子类,所以在类的声明中不能有Q_OBJECT宏、signal和slot。

20.抓图功能:

// 使用Qt自带的静态函数grabWindow,指定窗体ID,抓图的起启位置和面积大小。

QImage image = QPixmap::grabWindow(QApplication::desktop()->winId(), 0, 0, nDesktopWidth, nDesktopHeight).toImage().scaled(640, 480);

21.视图去掉滚动条

view->setFrameShape(QFrame::NoFrame);

通过布局指定视图的父窗体时,使用上面代码去不掉滚动条。而需要使用view = new QGraphicsView(this);指定父窗体。

最好办法是: view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 一直关掉滚动条

22.QpushButton圆角

QPushButton { border: 2px solid #8f8f91; border-radius: 6px; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f6f7fa, stop: 1 #dadbde); min-width: 80px; }

note: 当QPushButton无边框(border: 0px;),有设置背景颜色(background-color: rgb(6,43,58);)时,设置圆角会出现锯齿,因为圆角是边框为圆角,边框大小不能为0px.想让按钮只显示一种颜色(看不见边框颜色),则把边框颜色设为背景色即可。如图:



FROM: http://qiusuoge.com/12123.html


http://chatgpt.dhexx.cn/article/04JNB7f1.shtml

相关文章

Qt的ui界面操作

界面布局 界面布局的美化&#xff1a;拖拽widget&#xff0c;进行布局&#xff1a;水平布局、垂直布局、栅格布局&#xff1b;以及打破布局等。默认窗口和控件之间有9像素间隙&#xff0c;可以调整layoutLeftMargin 等属性若要使得widget大小和控件大小一样大&#xff0c;可以…

Qt界面开发(二)

首先给一个福利&#xff0c;学习qtQuick好的github地址。 https://github.com/zhengtianzuo/QtQuickExamples 效果图: 1.计划日历 下载地址:https://download.csdn.net/download/zhangxiaoyu_sy/10436208 2.无边框界面 下载地址:https://download.csdn.net/download/zhangxia…

Qt如何调用建立好的ui界面

在我们刚才学习qt的时候&#xff0c;很多的时候&#xff0c;按照新建立的工程文件&#xff0c;出现一个困扰。就是如何调用额外建立的UI界面。在这里主要是说明这里的面的关键因素。其实学习qt&#xff0c;如果之前有过学过C的同事&#xff0c;那么就学习qt就会很容易上手。因为…

Qt实战案例(13)——Qt的界面外观详细介绍

目录 一、Qt风格1.1 对风格进行预览1.2 风格使用 二、Qt样式表2.1 使用代码设置样式表2.2 在设计模式中设置样式表2.3 Qt样式表的语法2.4 子控件&#xff08;Sub-Controls&#xff09;2.5 伪状态&#xff08;Pseudo-States&#xff09;2.6 继承2.7 qss2.8 代码示例 三、特殊效果…

Qt-UI 界面工具库简介

一、关于Qt-UI界面工具库 Qt-UI界面工具库是武汉维仕杰科技有限公司基于Qt上进行扩展开发的控件包和界面工具&#xff0c;并且拥有完全自主的知识产权。得益于丰富的界面开发经验和强大的支持团队&#xff0c;使得Qt-UI界面开发工具成为最专业、功能强大的Qt开发工具库。 Qt-…

Qt UI界面美化

关于QSS 除原生界面外&#xff0c;Qt提供了加载配置文件的方式来自定义和美化界面外观&#xff0c;这个配置文件也叫做样式表&#xff08;QSS&#xff1a;Qt Style Sheets)&#xff0c;它的语法与css类似&#xff0c;具体支持属性可参考官方文档。 编写QSS文件 新建一个文件…

【思想落地】一文分享Qt界面的设计与开发

文章目录 一、开篇二、软件界面功能分析三、界面实现&#xff08;3-1&#xff09;从界面整体角度规划功能和切片&#xff08;3-2&#xff09;顶部时间参数的处理&#xff08;3-3&#xff09;左侧/右侧按钮控制区&#xff08;3-4&#xff09;中央传感器显示&#xff08;3-5&…

Qt调用主界面ui

一、适用情景 在其他类中使用主界面ui&#xff0c;this&#xff0c;控件操作等 二、步骤 首先&#xff0c;子类需要包含主界面的头文件和ui_xx.h文件&#xff0c;声明主界面类 然后使用构造函数把主界面的指针传递给子类 子类头文件&#xff1a; #ifndef ONEUI_H #define O…

QT——可视化界面ui

目录 1. 需要文件 2.文件关系及编写 3. 源码 4. 界面的模态与非模态 1. 需要文件 test.cpp test.h test.ui ui_test.h 2.文件关系及编写 test.ui&#xff1a; 可视化界面&#xff1b; test.cpp: 启动可视化界面&#xff0c;及可视化界面的各种相关功能源文件&#x…

QT中界面切换的三种方式

本周学习了QT的使用。QT身为一个图形界面的开发框架&#xff0c;在实际使用时必不可少的一环就是对不同界面的切换。本文中总结了自己练习使用过的三种切换界面的方式。 第一种&#xff1a;哪里进行界面切换就在哪里创建界面。 这种方式也是最容易理解的一种&#xff0c;当我们…

Qt界面开发(三)

这次要给大家分享一些我在github和qtcn&#xff08;主要是liudianwu大神&#xff0c;Qt界面开发(一)有很多都是他的作品&#xff09;上找到的比较漂亮且实用Qt界面和控件集合。 -------------------------------------我是分割线------------------------------------- &…

QT界面美化

转自点击打开链接 - 经验总结 1. 可用对话框&#xff08;QDialog&#xff09;模拟类似Android中toast的效果。 - 设置程序界面风格 在main函数中 QApplication::setStyle("windows"); QApplication::setStyle("windowsxp"); QApplication::setStyle("…

QT介绍和基本界面构建(QT一)

目录 一、Qt 介绍二、Qt工程1.工程 firstQt.pro2.Qt入口 三、用Qtcreator集成开发环境创建Qt工程代码ui1.创建项目的时候注意的问题2.desgner设计器界面说明 四、纯代码实现Qt工程创建带ui界面编译运行五、基本组件&#xff08;QLineEidt&#xff0c; QLabel&#xff0c; QPush…

QT 简单的登录界面

一、描述 有登录界面、注册界面&#xff0c;用到sqlite数据库保存账号和密码&#xff0c;界面还没有布局美化等&#xff0c;只实现了最基本的功能。 二、界面及功能介绍 1、登录界面2、注册界面 3、主界面 没想好弄啥功能&#xff0c;于是就弄了两个按钮。 4、文件结构 三、…

(四) 制作一个最简单的qt界面

前面我们学了 (一) 在Windows上搭建Qt环境 (二) Qt新建Android工程 (三) Qt入门篇之C基础 今天我们用Qt制作一个最简单的qt登录界面 一、在PC机上运行 1.QT基础 1.qt的移植性非常强&#xff0c;一套代码我们不用改的太多&#xff0c;直接通用所有的平台,不久的将来&#xff…

【Qt登录界面】

Qt登录界面 文章目录 Qt登录界面前言一、创建项目二、创建数据库及用户表三、登录界面设计四、注册界面设计五、效果图六、参考教程 前言 第一次在这上面写文章&#xff0c;没啥经验&#xff0c;如果有啥不当的地方&#xff0c;请各位大佬批评指正。我刚学Qt不久&#xff0c;结…

QT 简单的QT用户登录界面

简单的QT用户登录界面 一、简单描述 在登录界面输入用户名和密码正确之后才进入欢迎界面。 例子打包&#xff1a;链接: https://pan.baidu.com/s/1HEpNFghMDrBguMt93aRJ_A 提取码: bg4n 二、效果 三、工程文件结构 四、源文件 1、LoginForm02.pro文件 QT widgets guiSOUR…

一文读懂qt界面设计(分裂器,布局,拉伸,各种属性设置)

可以先看看我这个文章&#xff1a;qt关于界面设计中的一些知识总结_我是标同学的博客-CSDN博客_qt 水平伸展 现在我们来正式开始讲解。 布局种类 qt中能称为布局管理器的有如下6个&#xff1a; 水平布局&#xff08;QHBoxLayout&#xff09;垂直布局&#xff08;QVBoxLayout…

Qt界面开发(一)(各种控件以及图表)

注&#xff1a;资源主要来源&#xff1a;http://www.qtcn.org/bbs/u/110085 &#xff08;刘大神&#xff09; 如若侵权&#xff0c;请联系删除。 本文只是将作品集合到起来&#xff0c;方便大家一起学习。 资源集合已经放到 链接&#xff1a;https://pan.baidu.com/s/1sVvQE8…

嵌入式学习之QT学习----3 制作简单的QT界面(如:QQ登录界面)

1、创建一个QT工程 new project —> Application —> Qt Widgets Application —> choose…&#xff08;注意不要有中文路径&#xff09;填写名称&#xff08;我写的名称为class2&#xff09;和创建路径&#xff08;D:\qt\qt_demo\class2&#xff09; —> 填写类名…