Qt

Qt是一套应用程序开发库,与MFC不同,Qt是跨平台的开发类库

http://download.qt.io/archive

bilibili

qt的main函数中调用exec()时会进入死循环,如果正常退出会返回0,不正常则返回大于0的值。

qt_creator和clion开发是不一样的

https://zhuanlan.zhihu.com/p/461896034

  • 我们新建了一个Sources文件夹用于保存所有的QT源文件,在Sources下,FormsHeaders分别存放UI文件和.h头文件,所有的cpp源文件直接放在Sources目录下,这里在新建好文件夹之后,只需要把main.cpp直接拖拽到Sources下即可,clion 会自动帮我们处理cmake文件中路径的问题。
  • lib目录存放我们之后需要的MQTT第三方库的 .dll文件和.a文件
  • include目录存放第三方库的头文件

clion不可以打开.ui文件,还是需要借助qt_designer

注意

  • 开发目录不可含有中文

配置

常用类别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wDgYBxE7-1671093713895)(Qt.assets/2022-08-01 07-48-18 的屏幕截图.png)]

使用基类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jkUiSiK3-1671093713897)(Qt.assets/2022-08-01 07-52-30 的屏幕截图-16593115902391.png)]

文件结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQMrcYGx-1671093713899)(Qt.assets/2022-08-01 08-21-45 的屏幕截图.png)]

双重编译

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5NxEYbp-1671093713900)(Qt.assets/2022-08-01 08-29-47 的屏幕截图.png)]

QT_designer安装

http://t.zoukankan.com/qinlangsky-p-12703500.html

sudo pip3 install pyqt5
sudo apt-get install qt5-default qttools5-dev-tools
$ designer        //启动

UI文件设计与运行机制

clion的cmakelist文件发挥pro文件类似的作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHf8k624-1671093713901)(Qt.assets/2022-08-01 09-05-24 的屏幕截图.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFgEjrZZ-1671093713902)(Qt.assets/2022-08-01 09-09-17 的屏幕截图.png)]

Desinger页面组件

https://blog.csdn.net/zhangxue1232/article/details/115939701

Layouts

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrx4Az9O-1671093713903)(Qt.assets/20210421105802671.png)]

1、Vertical Layout 垂直布局,组件自动在垂直方向上分布
2、Horizontal Layout 水平布局,组件自动在水平方向上分布
3、Grid Layout 网格状布局,网格状布局大小改变时,每个网格的大小都改变
4、Form Layout 窗体布局,与网格状布局类似,但是只有最右侧的一列网格会改变大小

Spacers

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dF09prxf-1671093713905)(Qt.assets/2021042111070689.png)]

1、Horizontal Spacer 一个用于水平分隔的空格,可以将多个组件水平分隔开,添加N个即隔开N个空格距离
2、Vertical Spacer 一个用于垂直分隔的空格,可以将多个组件垂直分隔开,添加N个即隔开N个空格距离

Buttors

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzMoUqDT-1671093713906)(Qt.assets/20210421111002342.png)]

Push Button 普通按钮

Tool Button 工具按钮

        可以带图标 有两部分组成:文本text 和 图标icon(建议用png格式的图片)

Radio Button 单选按钮

check Box 多选框

Command Link Button 命令连接按钮

Dialog Button Box 对话框按钮

Item Views

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9mcxlUy-1671093713907)(Qt.assets/20210421111153330.png)]

List View 列表视图 : 像歌曲列表,文件列表,这种可以用QListView实现

Tree View 树视图

Table View 表视图 :可以像excel一样的显示数据

Column View 直栏浏览

Item Widgets

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXyqFdcq-1671093713909)(Qt.assets/20210421144418247.png)]

List Widget 列表小部件:可以显示一个清单,清单中的每个项目是QListWidgetItem的一个实例,每个项目可以通过QListWidgetItem来操作。

Tree Widget 树小部件

Table Widget 表小部件

Label: 标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPqsU5AM-1671093713910)(Qt.assets/2022-08-01 09-12-36 的屏幕截图.png)]

信号槽

信号槽每一个信号有4个元素,可以填入发送者,信号,接受者,槽

插入资源

1 https://www.cnblogs.com/yang12318/p/10699429.html

2 https://www.likecs.com/show-203744096.html

例:

为tool button添加图片

1 建立一个prc文件,内部以相对路径写入文件

<RCC><qresource prefix="/"><file>res/1.png</file><file>res/2.png</file><file>res/3.png</file><file>res/4.png</file><file>res/5.png</file><file>res/6.png</file><file>res/7.png</file></qresource>
</RCC>

2 载入prc文件

右击想加图标的Tool Button按钮,点击change styleSheet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7TNjZmy-1671093713910)(Qt.assets/img.webp)]

在弹出的窗口中,点击border-image

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWjkmNGr-1671093713911)(Qt.assets/img-165931915908911.webp)]

在弹出的窗口中,选择要添加的图标

主函数文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NnSqJ4Y5-1671093713912)(Qt.assets/2022-08-01 09-25-52 的屏幕截图.png)]

程序打包

https://blog.csdn.net/kangshuaibing/article/details/84951619?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase

安卓环境

https://blog.csdn.net/Arcofcosmos/article/details/118822458?spm=1001.2014.3001.5501

部署:https://blog.csdn.net/Arcofcosmos/article/details/122452036

添加视频

https://blog.csdn.net/zhang669154/article/details/78781011

find_package(Qt5 COMPONENTS Widgets LinguistTools Multimedia MultimediaWidgets REQUIRED)
include_directories(${Qt5MultimediaWidgets_INCLUDE_DIRS})

多线程

https://blog.csdn.net/qq_54395977/article/details/122725537

标准示范:

https://blog.csdn.net/quietbxj/article/details/121245304

实例

参考网址

//之前总是存在Timers cannot be started from another thread的报错,通过上面的参考网址在线程里加QTimer(this),确认将一个额外的定时器加线程,因为QTimer定时器不能在不同的线程中启动。
Mythread::Mythread() {timer = new QTimer(this);//这里timer->setInterval(30); // set cycleconnect(timer, &QTimer::timeout, this, &Mythread::sendSignal,Qt::DirectConnection);connect(this, &QThread::finished, timer, &QTimer::stop);timer->start();timer->moveToThread(this);
}void Mythread::sendSignal() {if (run_flag) {emit label->callMonitor();}
}void Mythread::run() {qDebug() << "MyThread::run:" << QThread::currentThreadId();this->exec(); //这个是Qt的消息循环,只有加这个才可以监听信号
}

报错

ui_mainwindow.h

// You may need to build the project (run Qt uic code generator) to get "ui_mainwindow.h" resolved

修改mainwindow.cpp

此时我们直接编译会报错,所以需要自己修改一下mainwindow.cpp,将最上方头文件的引入的地址进行修改:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9YWHBiL-1671093713913)(Qt.assets/v2-265b7b33191e3e0e24ba688c1d3ef0b5_720w.jpg)]

这里需要说明的是,QT会把UI文件预处理成对应的.h文件,然后在CPP文件中引用,生成的.h文件与UI文件同目录,所以我们想要引用的话需要正确设置文件的位置,正如上面所说一样,UI文件都在Forms目录下,所以我们引入的时候也需要指定Forms目录

这时候编译,就可以看到原来报错找不到定义或头文件的地方,都不会再报错了,因为编译过后,ui_MainWindow.h文件就会生成。

小知识点

QString转char*

qDebug() << “aaa” << QString(“bbb”) 的输出结果:aaa“bbb",如何让QString不输出引号?方法是将它转为char*

//先转换为QByteArray,再转char*
qDebug() << "aaa" << qstring.toUtf8().data();

释放窗口资源

\1. 对于使用指针,使用new创建的窗口,当然可以使用delete显示的释放其占用的资源:

Widget *w = new Widget();delete w;

\2. 对于使用指针,使用new创建的窗口,还可以使用QWidget::setAttribute方法来当窗口关闭后自动释放其占用的资源,而不用户显示的去调用delete释放,此方法当然也会调用窗口的析构函数:

Widget *w = new Widget();w->setAttribute(Qt::WA_DeleteOnClose);

这可以用于非模态对话框,因为非模态对话框如果是用指针形式创建,但是再接着delete的话,窗口就没了,如果不使用delete释放窗口占用的资源,又会赞成泄漏。如果使用普通变量创建,同样的也因为变量作用域马上就结束而窗口也没了,

另一种方法就是使用多线程,不过这个的代价大了点。所以这种技术在创建非模态对话框上是非常典型的运用。

测试方式:在Widget中分配大量的内存,显示与关闭多个此类窗口,看看任务管理器里此程序的内存变化情况,是否真正的释放了占用的内存(当然释放了)。在C++中使用new分配内存时,如array = new double[length],此时,给array的内存实际上并没有真正的分配,必须等到第一次使用这些内存后才会真正地为其分配物理内存,如:memset(array, 1, length * sizeof(double))

\3. 窗口的内存管理交给父Widget:

Widget *w = new Widget(parent);

但这时,如果父Widget不结束,这个窗口的资源一直会占用着。

小项目

女优抽取(初级)

首先需要了解TextEdit控件的各种操作

随机数

要产生随机数r, 其范围为 m<=r<=n,可以使用如下公式:
rand()%(n-m+1)+m
其原理为,对于任意数,
0<=rand()%(n-m+1)<=n-m
于是
0+m<=rand()%(n-m+1)+m<=n-m+m
即
m<=rand()%(n-m+1)+m<=n
#include iostream;
#include ctime;
#include cstdlib;using namespace std;int main ()
{int i,j;// 设置种子srand( (unsigned)time( NULL ) );/* 生成 10 个随机数 */for( i = 0; i  10; i++ ){// 生成实际的随机数j= rand();cout "随机数: "  j  endl;}getchar();  return 0;
}

结果输出到文本框

因为append()函数使用字符串类型是QString,所以需要先转换vector

ui->export_edit->append(QString::fromStdString(SSS[i]));

不同颜色文本

综合了所有方案,决定结合QString,先赋值,再在QString内改颜色。

tr 提供汉化翻译作用,即translator,而arg()是用来替换的,%1 .arg()组合相当于c语言的printf中的(%d, a)

QString buf;buf = QString::fromStdString(SSS[i]);
QString buf = "hello";
buf = QObject::tr("<font color=\"#FFD700\">%1</font>").arg(buf);buf = QObject::tr("<font color=\"#FFD700\">%1</font>%2").arg(buf, QString("(保底)"));

历史记录

c++ vector存数组

一维数组初始化:

其中vec: 数组名;n: 数组大小

vector<int> vec(n);
vector<int> vec(n, 0);

二维数组初始化:

其中 vec: 数组名;rows: 数组行数;cols: 数组列数。

vector<vector<int>> vec(rows, vector<int>(cols, 0));

三维数组初始化:

vector<vector<vector<int>>> vec(n1, vector<vector<int>>(n2, vector<int>(n3, 0)));

删除vector第一个元素

vector<int>::iterator k = vector.begin();
vector.erase(k);

删除vector全部元素

//1
vecInt.clear();//2for ( vector <int>::iterator iter=vecInt.begin();iter!=vecInt.end();){iter=vecInt.erase(iter);}

最终采用

pair<>

https://blog.csdn.net/m0_37957160/article/details/106709915

#include <cstdlib>std::vector<pair<int,int>> history;//插入
history.push_back(std::make_pair(a,b));
//不知为何,使用erase(history.bengin(),history.end());后保底字体颜色会变。

查找vector元素

用于账户查找

写迭代器:vector::iterator t; 调用find方法:t = find(v.begin(),v.end(),查找的元素); 和v.end()进行比较,如果找到了,那么t就不会指向 v.end(),也就是 t != v.end()

抽卡视频

现有的百度关于cmake添加QT multimedia包(mac,ubantu)都是错误,正确的添加方式如下,cmake 添加2行

set(Qt5MultimediaWidgets_DIR **/Qt5.9.8/5.9.8/clang_64/lib/cmake/Qt5MultimediaWidgets)#包的位置
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Multimedia)#链接到库

添加Multimedia库

//安装开发包,不过这种方法不太对,因为安装qt后肯定会有该包的,一般是cmake没写好
apt-get install qtmultimedia5-dev//find_package加入ultimedia MultimediaWidgets
find_package(Qt5 COMPONENTS Widgets Multimedia MultimediaWidgets REQUIRED)//target_link_libraries加入Qt5::MultimediaWidgets
target_link_libraries(qt_AssWeCan_2 PRIVATE Qt5::Widgets Qt5::MultimediaWidgets)

抽卡动图

//放gif动图QMovie *movie = new QMovie(":/images/XXX.gif");ui->label2->setMovie(movie);//播放动图movie->start();

只播放一遍

int QMovie::currentFrameNumber() const //计算当前帧号,从0开始int frameCount() const         //总共帧号当当前帧号等于(总帧数-1)时停止

注意start后会一直播放

//抽卡动画结束后先暂停所有动画
void Mylabel::toBackGround() {movie_gold->stop();movie_blue->stop();movie_blue->stop();movie_background->start(); //先statrt再赋值this->setMovie(movie_background);this->movie_current = Mylabel::movie_num::back;this->lower();
}

抽卡结果(图片)

Label标签有加入图片的能力,通过格栅布局将10连的结果以label的形式展示出来

设置背景图片

1.在paintEvent事件中绘制图片

void Widget::paintEvent(QPaintEvent * ev)
{QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/bg.jpg"),QRect());
}

drawPixmap在Widget的整个矩形区域绘制背景图片,第三个参数为要绘制的图片区域,传入空的矩形表示整个图片区域。通过这种方式可以将图片平铺到窗口上,缺点就是要使用paintEvent事件需要新建一个类,不适合子窗口。

2.使用调色板QPalette来设置图片

QPalette pal =this->palette();
pal.setBrush(QPalette::Background,QBrush(QPixmap(":/bg.jpg")));
setPalette(pal);

首先获得Widget的调色板,然后设置设置调色板背景(setBrush),最后将调色板设置到Widget中。

  1. 使用样式表(setStyleSheet)

使用样式表可以很方便设置界面,而且非常高效,还能让界面和逻辑分离。真的是Qt里非常好用的一个东西,设置背景图片的语句也很简单.

setStyleSheet("border-image:url(:/bg.jpg)");

不知道为什么主窗口设置的图片会出现在控件上

已解决

将widget内设置背景改为label设置背景,是否覆盖由raise()和lower()操纵

    //背景label_background = new Mylabel(this);label_background->resize(1280,720);label_background->move(0,0);//movie->setWindowFlags(movie->windowFlags() | Qt::Dialog);label_background->setStyleSheet("QWidget{border-image: url(:/Images/UI/back_ground.png)}");label_background->lower();label_background->show();

label显示图片

    QLabel *label_image = new QLabel(widget);QPixmap pix(":/img/积跬步至千里.png");                                //显示图片方法1:利用QPixmaplabel_image->setPixmap(pix);//显示图片原始尺寸,如果label_image尺寸比图片原始尺寸小,那么只显示图片的一部分label_image->setScaledContents(true);//图片跟随label_image尺寸比例变化,图片原始的长宽比例在这显的不重要,因为可以会随着label_image的尺寸随意变化(对样式表方式无效)//样式表也可以显示图片

背景透明而字体正常显示

setAttribute(Qt::WA_TranslucentBackground);

窗口透明度

setWindowOpacity(0.5); //半透明

部件透明度

// 部件透明设置QGraphicsOpacityEffect *opacity = new QGraphicsOpacityEffect;opacity->setOpacity(0.2); //透明范围同窗口透明度ui->pushButton->setGraphicsEffect(opacity);

设置圆角按钮

依据鼠标是否被捕捉到来设置圆角按钮不同的弧度,这样有按键动效

setStyleSheet中设置

border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;

https://blog.csdn.net/qq_40015157/article/details/125768954

最终采用

setStyleSheet("QToolButton{background-image:url(:/Images/UI/tool_btn.png); border:2px double white; border-radius:10px;//双实线边框,还可以用border-color: 自定义边框颜色}");
 lineEdit->setStyleSheet(/*"color: blue;"*/"background-color: yellow;""selection-color: yellow;""selection-background-color: blue;" );//自定义颜色
background-color: rgb(255, 253, 252);

样式表:border边界

https://blog.csdn.net/weixin_48465741/article/details/116244256

鼠标事件

需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:

QWidget::mousePressEvent()
QWidget::mouseReleaseEvent()
QWidget::mouseDoubleClickEvent()
QWidget::mouseMoveEvent()

鼠标移动到控件触发事件

https://m.qiyeshangpu.com/wen/05598c0193d1cdd5edc7a9973c8830f3.html

属性可以通过setMouseTracking函数进行设置,通过hasMouseTracking函数进行获取。

相关的事件响应函数是mouseMoveEvent()。

QTableView m_tableView = new QTableView(this);
m_tableView->setMouseTracking(true); // 设置鼠标追踪
connect(m_tableView, &DTableView::entered, this, &SecurityLogDialog::doMouseTrackTip)

还有**leaveEvent()**事件,所以鼠标移动到按钮,按钮变化什么的不需要根据是否移动到其他控件时触发returnBtn()来恢复,直接重载leaveEvent()即可

判断是否在框内

https://blog.csdn.net/hushiwei1993/article/details/78204635

鼠标按下

    // 如果是鼠标左键按下if(event->button() == Qt::LeftButton){···}// 如果是鼠标右键按下else if(event->button() == Qt::RightButton){···}

鼠标划过变手形

当鼠标滑过QPushbutton按钮控件时,将鼠标箭头变为手型代码如下:

button->setCursor(QCursor(Qt::PointingHandCursor));

其他

enum CursorShape {ArrowCursor,UpArrowCursor,CrossCursor,WaitCursor,IBeamCursor,SizeVerCursor,SizeHorCursor,SizeBDiagCursor,SizeFDiagCursor,SizeAllCursor,BlankCursor,SplitVCursor,SplitHCursor,PointingHandCursor,ForbiddenCursor,WhatsThisCursor,BusyCursor,OpenHandCursor,ClosedHandCursor,DragCopyCursor,DragMoveCursor,DragLinkCursor,LastCursor = DragLinkCursor,BitmapCursor = 24,CustomCursor = 25};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn6IqrBd-1671093713915)(1_Qt.assets/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ-WQm-iOq-eskQ==,size_20,color_FFFFFF,t_70,g_se,x_16.png)]

当然在designer中也可以设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGDERjof-1671093713916)(1_Qt.assets/2022-10-21 15-38-27 的屏幕截图.png)]

添加音效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EI42w8rp-1671093713917)(1_Qt.assets/2022-08-22 22-53-23 的屏幕截图.png)]

网易云界面

去掉标题栏

在用QT编写界面时,去掉标题栏方法比较简单,就一行代码

this->setWindowFlags(Qt::FramelessWindowHint);

去掉以后不能移动窗口了,于是重写了三个鼠标事件:

.h文件的代码:

#include <QMouseEvent>
protected:void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);
private:QPoint last;

.cpp文件的代码

//可以在构造函数中初始一下last变量用其成员函数setX,setY就是了
//接下来就是对三个鼠标事件的重写
void MainWindow::mousePressEvent(QMouseEvent *e)
{last = e->globalPos();
}
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{int dx = e->globalX() - last.x();int dy = e->globalY() - last.y();last = e->globalPos();move(x()+dx, y()+dy);
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{int dx = e->globalX() - last.x();int dy = e->globalY() - last.y();move(x()+dx, y()+dy);
}

复制过去用的时候记得把类名改掉

这样就OK了,去掉窗口标题栏后还能拖动窗体

百度网盘

添加窗口阴影

实现控件的阴影效果

QWidget * widgetInner = new QWidget(this);
widgetInner->setGeometry(0, 0, 280, 283);
widgetInner->setStyleSheet("background: #FFFFFF;");
//实例阴影shadow
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
//设置阴影距离
shadow->setOffset(0, 0);
//设置阴影颜色
shadow->setColor(QColor("#444444"));
//设置阴影圆角
shadow->setBlurRadius(30);
//给嵌套QWidget设置阴影
widgetInner->setGraphicsEffect(shadow);
//给垂直布局器设置边距(此步很重要, 设置宽度为阴影的宽度)
widgetInner->setMargin(24);//设置为0时,就看不到边框的阴影

注意,setMargin()是旧版代码,我们强烈建议使用以下替代

void QLayout::setContentsMargins(int left, int top, int right, int bottom)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3y6BICiI-1671093713918)(1_Qt.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxva2FuZHk=,size_16,color_FFFFFF,t_70#pic_center.jpeg)]

实现无边框窗口的阴影效果

在构造函数中,除了第一点的代码之外,再加上以下代码:

//设置窗体透明
this->setAttribute(Qt::WA_TranslucentBackground, true);
//设置无边框
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

最终使用

  auto *main_wid_shadow = new QGraphicsDropShadowEffect(this);main_wid_shadow->setOffset(8, 6);main_wid_shadow->setColor("#444444");main_wid_shadow->setBlurRadius(20);ui->main_widget->setGraphicsEffect(main_wid_shadow);ui->main_widget->setContentsMargins(1, 1, 1, 1);

新方法:划过按钮的底色

对网易云的不用展开的界面有效

//样式表
QListWidget
{color:rgb(0,0,0);background:rgb(255,255,255);
}*
{outline: 0px;
}QListWidget::Item
{height: 40;border:0px;
}QListWidget::Item::hover  //划过触发
{border:0px;border-radius:5px;background:rgb(250,250,252);
}QListWidget::Item::selected  //选中触发
{border:0px;border-radius:5px;background:rgb(237,249,254);
}

QLabel改变字体颜色

方法1使用色板

QPalette txt_color_;  //初始化色板txt_color_.setColor(QPalette::Text,QColor(255,255,255));//颜色也可以用枚举ui->title_label->setPalette(txt_color_);

方法二使用样式表

setStyleSheet("color:red;");
//setStyleSheet("color:#ff6600;");

下拉框/隐藏Layout里的部件

事实证明,隐藏控件后弹簧会把剩下的控件挤下去,因此可以通过弹簧和隐藏展开,收缩栏目

先获取所有子控件,然后隐藏

for (int i = 0; i < ui->horizontalLayout->count(); ++i) {QWidget* w = ui->horizontalLayout->itemAt(i)->widget();if (w != NULL)w->setVisible(false);
}

采用

在展开按钮里设置信号,这个函数设为槽,准备一个展开状态的bool变量

void Widget::ItemVisableTog()
{if(item_visable_state_){for (int i = 0; i < item_layout->count(); ++i) {QWidget* w = item_layout->itemAt(i)->widget();if (w != NULL)w->setVisible(false);}item_visable_state_ = false;}else{for (int i = 0; i < item_layout->count(); ++i) {QWidget* w = item_layout->itemAt(i)->widget();if (w != NULL)w->setVisible(true);}item_visable_state_ = true;}
}

不让图标挡住输入框

我们在使用QLineEdit显示文本的时候,希望在左侧流出一些空白位置,这个时候就需要我们使用QLineEdit提供的setTextMargins函数:
函数声明:void QLineEdit::setTextMargins(int left, int top, int right, int bottom)
此函数可以指定显示的文本与输入框上下左右边界的像素数

图标就是一个label。然后这个size是图标的大致的大小(并不精确),但是留出这个空间也够用了。

//一般小图标就是这个大小
QSize size = QSize(30, 30);
// 设置输入框中文件输入区,不让输入的文字被隐藏在按钮下
ui->lineEdit->setTextMargins(size.width(), 1, 1 , 1);
  //提示信息ui->search_lineEdit->setPlaceholderText("请输入搜索内容");//开启一键清除ui->search_lineEdit->setClearButtonEnabled(true)

其他花活;https://blog.csdn.net/foreverjueye/article/details/124420322

取消输入框焦点

输入框选中时会有蓝色边框,这个表示处于焦点状态,我们可以手动去焦

ui->search_lineEdit->clearFocus();

1_Qt的介绍和开始相关推荐

  1. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  2. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  3. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  4. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  5. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

  6. Pytest - 使用介绍

    1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...

  7. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  8. k8s核心组件详细介绍教程(配超详细实例演示)

    本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...

  9. Tensorrt一些优化技术介绍

    Tensorrt一些优化技术介绍 Figure 1. A quantizable AveragePool layer (in blue) is fused with a DQ layer and a ...

最新文章

  1. 杨立昆辞Facebook人工智能实验室主任,任首席科学家
  2. 全球与中国文件夹架市场研究与商业模式创新分析报告2022-2028年
  3. linux部署jar项目报错_Spring boot项目部署linux系统tomcat报错解决办法
  4. RestTemplate.getForObject返回List的时候处理方式
  5. 【云小课】基础服务第25课 容灾演练:平时多练兵,急时保可用!
  6. 如何在Android上使背景20%透明
  7. abb变频器580系列改中文_ABBACS580一01变频器选择使用语言错误后怎么办?
  8. 简易的NTC-10K-3950测温
  9. 聚合支付、第四方支付有哪些平台?
  10. 2021 编程语言排行榜出炉!
  11. 物联网与传统的互联网相比,主要具备哪些基本特征?
  12. Microk8s单机安装
  13. android studio 56 下载网络歌曲 代码
  14. 计算机组成原理——微程序控制器
  15. unicode 生僻字_基于Unicode编码技术的地名生僻字库研究
  16. 自考本科计算机有哪些专业可以选,自考本科有什么专业可以选择
  17. 天子呼来不上船,自称臣是酒中仙——我的嗜酒情节
  18. IEEE 802.15.4和ZigBee
  19. 在线webp转换jpg免费转换教程
  20. 代码调整技术(Code-Tuning Techniques)

热门文章

  1. Android项目---拼图小游戏(下)
  2. python电影数据分析报告_【python数据分析实战】电影票房数据分析(二)数据可视化...
  3. 2019 杭电 多校第3场 1006 Fansblog (HDU 6608)
  4. c语言的内存布局规律
  5. 量子计算机是哪个国家研制出来,万万没想到:最强大量子计算机居然由工业巨头研制出来了...
  6. python绘制旭日图
  7. 生成器、迭代器、推导式——思维导图
  8. LaTeX目录居中及目录字体设置
  9. 【区块链基础】5——ETH协议
  10. 【chrome】Chrome源码剖析、上--多线程模型、进程通信、进程模型