❶ Qt中如何利用 png 图片来实现自定义形状的窗口
Qt 中 QWidget::setMask() 的用法 把QWidget 自定义成各种形状,使用 png 透明图片作为窗体显示,效果如下
关键知识: Qt::WindowFlags 使窗口支持无边框 [From Qt Doc:This enum type is used to specify various window-system properties for the widget. They are fairly unusual but necessary in a few cases. Some of these flags depend on whether the underlying window manager supports them.]。使用 Qt::WindowFlags 可以实现一些不同类型的窗口,如:用 Qt::FramelessWindowHint 来实现无边框窗口,用 Qt::Popup 来实现弹出式的窗口,用 Qt::Tool 来实现工具窗口,用Qt::CustomizeWindowHint 来关闭窗口标题栏以及与 Qt::WindowCloseButton(添加关闭按钮),Qt::WindowMaximumButtonSize(添加最大化按钮)联用来建立只有关闭按钮和最大化按钮的窗口,用 Qt::WindowStaysOnTopHint 使窗口永远在最前端等。 Qt::WidgetAttribute 使窗口支持透明背景以及在关闭后主动销毁。其它一些常用的 Attribute 有:Qt::WA_AcceptDrops 使 widget 支持拖拽操作,Qt::WA_MouseTracking 使 widget 及时响应鼠标移动事件(MouseMoveEvent)。Qt::setMask() 函数对窗口进行部分区域遮掩来实现各种形状的窗口。[From Qt Doc:Causes only the pixels of the widget for whichbitmap has a corresponding 1 bit to be visible. If the region includes pixels outside the rect() of the widget, window system controls in that area may or may not be visible, depending on the platform.]。Qt::ContextMenuPolicy 来配置窗口的右键菜单方案。[From Qt Doc:This enum type defines the various policies a widget can have with respect to showing a context menu.]。paintEvent() 回调函数来对窗口进行绘制。 重写 mousePressEvent() 和mouseMoveEvent() 函数来实现窗口的拖拽移动(无边框窗口没有标题栏,默认拖拽窗体是没法移动窗口的)。部分代码解释:头文件: 1:#ifndef SHAPEDWIDGET_H 2:#define SHAPEDWIDGET_H 3: 4:#include <QWidget> 5:class QPoint; 6:class QPixmap; 7:class ShapedWidget : public QWidget 8: { 9: Q_OBJECT 10:public: 11:explicit ShapedWidget(QWidget *parent = 0); 12: ~ShapedWidget(); 13: 14:private slots: 15:void changeSkin(); 16: 17:protected: 18:void mousePressEvent(QMouseEvent *); 19:void mouseMoveEvent(QMouseEvent *); 20:void paintEvent(QPaintEvent *); 21: 22:private: 23:void initData(); 24:void initVisualComponents(); 25:void setupContextMenu(); 26: 27: QPoint* dragPos_; 28: QPixmap* backgroundPixmap_; 29: }; 30: 31:#endif // SHAPEDWIDGET_H构造: 1: ShapedWidget::ShapedWidget(QWidget *parent) : 2: QWidget(parent, Qt::FramelessWindowHint) //无边框窗体 3: { 4: initData(); //初始化数据,这个demo里面就两个,具体下面有解释 5: initVisualComponents(); //初始化私有可视部件,这个demo里面没有私有的其它部件,所以只做了窗口的一些属性设置 6: setupContextMenu(); //设置右键菜单,分配各种QAction内存空间以及连接SIGNALS和SLOTS 7: setAttribute(Qt::WA_DeleteOnClose); //关闭事件发生后就主动从内存中销毁窗口 8: setAttribute(Qt::WA_TranslucentBackground); //透明背景支持 9: } 拖拽移动窗体(下面有图示): 1:void ShapedWidget::mousePressEvent(QMouseEvent *event) 2: { 3:if(event->button() == Qt::LeftButton) 4: { 5: *dragPos_ = event->globalPos() - frameGeometry().topLeft(); 6: event->accept(); 7: } 8: } 9: 10:void ShapedWidget::mouseMoveEvent(QMouseEvent *event) 11: { 12:if(event->buttons() & Qt::LeftButton) 13: { 14: move(event->globalPos() - *dragPos_); 15: event->accept(); 16: } 17: } 窗口绘制: 1:void ShapedWidget::paintEvent(QPaintEvent *) 2: { 3: QPainter painter(this); 4: painter.fillRect(0, 0, backgroundPixmap_->width(), backgroundPixmap_->height(), *backgroundPixmap_); 5: } 更换皮肤: 1:void ShapedWidget::changeSkin() 2: { 3: QAction* source = qobject_cast<QAction*>(sender()); //获取发送该信号的信号源,并转换对象 4: backgroundPixmap_->load(source->data().toString()); //因为给每个 QAction 赋了图片的地址的字符串 5://所以可以通过 data() 来获取该值,并更新背景图片的内容 6: resize(backgroundPixmap_->width(), backgroundPixmap_->height()); //窗口大小尽可能小,尽管在 mask 外的窗体不会响应 mouse event 7: clearMask(); //清除原来的 mask 8: setMask(backgroundPixmap_->mask()); //根据新的背景图片来重新设置 mask 9: update(); //更新窗口 10: }
❷ QT快捷截图怎么操作
截图功能是QT语音为游戏玩家和娱乐玩家打造的功能,共享好玩有趣的图片给房间内的好友,交流更方便。
使用方法:
用户点击输入框左侧的截图按钮,或通过截图热键(Ctrl+Alt+F9)使用截图功能。
点击输入框中的缩略图可以收起和展开预览气泡,点击预览气泡右下角的图标,可以删除图片,图片一次只能发送一张。
截图热键可在系统设置-基本设置-热键中自定义。
其他功能:
用户也可以通过复制其他聊天软件(如QQ)的图片粘贴到QT的输入框中进行发送,也可以选择一个图片文件(支持jpg和gif)进行复制,粘贴到QT的输入框中。
使用限制:
1.普通图片如jpg和png图片最大不能超过1MB,gif图片不能超过50k。
2.房间人数大于等于500人时,只有管理员才可以发送图片。
3.房间人数大于等于10000人、图片大于300KB、图片尺寸过大时,接受到的图片不会自动下载。
4.用户每天(24小时内)发送图片数量的上限是100张。
5.图片尺寸宽度486*400后按比例缩放显示,双击图片可查看原图。
6.V3.2以下版本不支持截图发图功能,收到图片后显示为空白。
功能管理:
1.管理员可在子房间设置-公屏聊天中,设置“禁止游客发送图片”“限制图片发送速度”
2.管理员可以对子房间进行右键操作,禁止该子房间所有人发送图片。
3.管理员可以对子房间进行右键操作,禁止该子房间所有人发送图片。
4.用户可在公屏空白处右键菜单内勾选“屏蔽图片”,设置后接受到的图片不会自动下载。
5.图片缓存可以通过QQ电脑管家类的安全软件进行清理。
❸ qt中如何去掉主窗口标题栏
#include <QtGui/QApplication>
#include <qtextcodec.h>
#include <QtGui/QDialog>
#include <QtCore/QTimer>
#include "widget.h"
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QApplication a(argc, argv);
QDialog dialog;
dialog.setStyleSheet(QString::fromUtf8("background-image: url(:/images/1.PNG);/n"
"color: rgb(0, 255, 0);/n"
"font: 75 16pt /"/345/256/213/344/275/223/";"));
dialog.setGeometry(QRect(50, 50, 350, 250)); //可设置窗口显示的方位与大小
dialog.setWindowFlags(Qt::FramelessWindowHint); //也是去掉标题栏的语句
Widget w;
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &w, SLOT(showNormal()));
QObject::connect(&timer, SIGNAL(timeout()), &dialog, SLOT(accept()));
timer.start(5000);
dialog.exec();
w.showNormal(); // 1、可更改的地方。
return a.exec();
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QMessageBox::StandardButton message;
QApplication::setStyle(QStyleFactory::create("plastique"));
QApplication::setPalette(QApplication::style()->standardPalette());
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(mountMessage()));
connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(umountMessage()));
connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(saveMessage()));
connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(adjustMessage()));
connect(ui.pushButton_7, SIGNAL(clicked()), this, SLOT(about_usMessage()));
connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(stop_saveMessage()));
connect(ui.pushButton_6, SIGNAL(clicked()), this, SLOT(touchMessage()));
connect(ui.pushButton_8, SIGNAL(clicked()), this, SLOT(exitMessage()));
mount_u(); //挂载U盘成功!
if( !have_video() ) { //if have WebCam?
message = QMessageBox::information(this, tr("摄像头未连接"),
tr("摄像头未连接,请连接摄像头。") );
}
setWindowFlags(Qt::FramelessWindowHint); /2、可更改的地方
setWindowTitle(tr("欢迎使用迷你监控器!"));
}
程序中更改两处显示主窗口的样式。
1、该处可设置窗口大小样式,有四种选择
w.show(); 实际大小
w.showEvent() 自定义大小
w.showFullScreen(); 全屏
w.showMaximized(); 最大化
w.showMinimized(); 最小化
w.showNormal(); 正常
2、该处是去掉窗口标题栏的语句
❹ 在Qt中如何设置Windows应用程序的图标和窗口图标
设置windows窗口图标的方法:
this->setWindowIcon(QIcon("myapp.png"));
设置应用程序的方法:
1、在你的工程目录创建一个txt文档,写入:
IDI_ICON1ICON"app.ico"
2、重命名改文件为*.rc.,比如app.rc
3、在工程*.pro中添加如下代码
RC_FILE=app.rc
4、拷贝一张ico的图片至工程目录,命名为app.ico,编译即可。
❺ qt中主窗口背景设置
以前遇到的很多小知识,从今天开始都一点一点记录下来。。。
窗口背景无非两种:背景色、背景图片。Qt中窗口背景如何设置?下面介绍三种方法:
一、QPalette设置背景
二、实现paintEvent,使用QPainter来绘制背景
三、使用QSS来设置背景
关于QSS的使用不想多说,一般我不用QSS设置窗口背景,也不建议使用。(注意:这里是对于窗口而言)。如果是子部件当然可以。因为窗口使用QSS设置背景之后,若子部件不使用同样的方式来设置,默认则会继承父窗口的样式
子部件一般情况下也不需要设置背景图片,即使需要使用QSS也完全可以满足。设置较多的是背景色与图标,QSS中使用background或者background-color的方式可以实现背景色的设置,图标则可以使用setPixmap或者setIcon来设置!
下面介绍QPalette以及paintEvent
一、QPalette设置背景
构造函数中可以使用如下方式:
(1)设置背景色
QPalette palette(this->palette());
palette.setColor(QPalette::Background, Qt::black);
this->setPalette(palette);
或:
QPalette palette;
palette.setBrush(this->backgroundRole(), Qt::black);
this->setPalette(palette);
这里setColor和setBrush都可以使用!
(2)设置背景图片
QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());
QPalette palette(this->palette());
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette(palette);
上面方式无论设置背景色还是背景图片QPalette::Background与this->backgroundRole()是等价的!
二、paintEvent设置背景
(1)设置背景色
void IIIMark::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::black);
painter.drawRect(this->rect());
}
(2)设置背景图片
void IIIMark::paintEvent(QPaintEvent *)
{
QPixmap pixmap = QPixmap(":/qm/safe").scaled(this->size());
QPainter painter(this);
painter.drawPixmap(this->rect(), pixmap);
}
注意:
(1)以上都是用scaled方式对图片进行了适应窗口大小的设置,因为所给的图片大小不一定满足要求,所以采用此方式!当然图片经过拉伸或者压缩之后会变形(纯色图片除外),所以对图片采用此方式时需要注意。
(2)设置背景范围的时候如果需要充满整个窗口最好使用this->rect(),因为我看到很多人在使用QRect(0, 0, 400, 400)之类的语句,那么如果窗口大小改变了呢?此句是不是要跟着变呢?
(3)如果需要背景图片或者背景色随可以发生改变时,也就是所谓的换肤功能,则采用paintEvent的方式,在需要改变的时候使用update()来进行更新。
(4)this->setAutoFillBackground(true)又让我想起了tr(),被很多人滥用。这句话在什么时候使用呢?不妨采用QPalette设置背景的方式加上与去掉这句话对比一下(在有父窗口的情况下使用)。如果这个QWidget直接show,则有背景色,如果放到一个父窗口中,就没有效果。添加该句即可!
❻ Qt中布局里有布局,如何删除内嵌布局
先获取之前的布局,然后删除布局,再删除控件。
这里删除的时候先获取之前的布局,然后删除布局,再删除控件,控件删除时是按照类型来删除的,主要由其父窗口来看类型,找到某一类的控件,然后返回对应的列表,然后删除,另外创建控件后根据控件的数量调整布局所在窗口的大小。
当根据数据来创建控件并布局时,如果数据更新,那么之前创建的控件便需要删除后重新创建布局。
❼ Qt里面怎么绘制透明图,镂空图之类的
1、打开一张水果图片 2、(示例图) 3、将水果抠出,复制生成图层1。 4、单击工具箱中的“钢笔工具”按钮,绘制出如图二所示的钢笔路径。 5、单击工具箱中的“路径选择工具”,按住“Shift+Alt”键,在绘制的路径上按住左键向下拖拽鼠标,对其进行复制,效果如下: 6、单击工具箱中的“转换点工具”,对控制柄进行调整效果如下图所示。 7、将路径转换为选区,然后将“图层1”设置为当前层,按删除键删除选择区内的图形,如下: 8、取消选区,再单击“路径”面板中的“工作路径”将其选择,然后单击“路径”面板右上角的三角按钮,在弹出的菜单中选择“存储路径”命令。 9、在弹出的对话框中,将“工作路径”存储为“路径2”,单击好,将“路径2”复制生成为“路径2副本”。 10、单击工具箱中的“路径选择工具”,在画面中选取钢笔路径,然后选择菜单栏中的“编辑”“变换路径”“垂直翻 转”命令,将路径垂直翻转,效果如下图所示。 11、单击工具箱中的“转换点工具”,将翻转后的钢笔路径调整至如下图所示。 12、用同样的方法,将复制出的钢笔路径依次选择并垂直翻转,然后调整至如下图所示的形态。 13、单击工具箱中的“椭圆”按钮,在画面中绘制出如下图所示的椭圆选区。 14、单击路径面板底部的将“选区转换为路径”如图十,然后按“Ctrl+X”键,将转换的钢笔路径剪切到剪贴板中。 15、将“路径2副本”设置为当前工作状态,按“Ctrl+V键,将路径粘贴到”路径2副本“中。 16、按“Ctrl+T”键,为路径添加自由变形框,调整效果如下图所示。 17、新建图层2,调整到图层1的下方,然后按将路径转换为选区。 18、设置前景色为黑色,背景色为灰色,然后单击“渐变”工具,由上至下填充渐变色,如下: 19、取消选区,选择菜单栏中的“滤镜”“杂色”“添加杂色”命令,弹出“添加杂色”对话框,参数设置如下图: 20、调整“色相/饱和度”对话框,参数设置如图: 21、将“路径2”显示在画面中。 22、回到图层面板,新建“图层3”,设置前景色为浅灰色。 23、选择工具箱中的“画笔”,设置如下图。 24、打开“路径”面板,单击其下方的“描边路径”,用设置的笔头描绘路径,然后在灰色区单击,将路径隐藏, 用“橡皮”工具将描绘的下方檫除。 25、将“路径2副本”显示在画面中,打开“图层”面板,新建“图层4”并调整到图层1的下方。 26、打开“路径”面板,单击其下方的“描边路径”,用设置的笔头描绘路径,然后在灰色区单击,将路径隐藏,用 “橡皮”工具将描绘的下方檫除,将不透明度设置为60%效果如图: 27、将图层合并为图层1,复制并调整图层1,制作投影效果,如图: 填充黑色,高斯模糊,完成最终效果如图!
❽ qml删除加载的文件夹加载qrc图片
在目录里删除,文件夹依然存在,加载图片也会报错。
第一,在文件夹中打开工程目录,删除资源文件夹,再用QTCreater打开项目,工程目录中的qml。qrc,拖到QTCreater,第二,拖拽后,会出现以下界面,点击RemovingMissingFiles,关闭项目,重新打开就可以了。
在QT的开发中需要添加图片等资源文件,以下是添加方法。1工程目录中新建文件夹,命名自定义(如my_resource),需要至少添加一个图片或其他文件。2打开项目,选择根目录,点击右键,添加现有文件,选择图片。
❾ qt怎么在主页设置照片
你好!先找到自己右键点击 ,选择个人设置之后出来一个页面,可以设置照片。
❿ qt实现多张图片的切换不使用ui控件
通过上方控件中,寻找所适合的控件,之后将其拖拽到自己合适的位置上:
具体布局如下图所示:
2.设置ui控件名称
如上图所示,我将每一个单选按钮都设置了相对应的名字,分别为上方的radioButton_16 /32 /64 /128 /256
其余的控件也都设置了相应的类名(名字),那我们就来使用它们吧.
3.使用控件进行界面交互
3.1 选择图片
右键点击选择图片按钮,之后点击转到槽选项,继续点击弹出框中的clicked()点击交互按钮‘会自动跳转到写入代码的位置,同时在Headers下的app.h中,会自动导入插槽内’意味着,我们能通过这个点击事件来展示我们所需要的交互内容.
那么,着手于代码的操作吧:
‘在Sources下的app.cpp中’
我们能看到自动生成的代码块,其中:
app 我们所挂载的媒介,这个媒介app下,仍有着其他的属性
pushButton_file 这个按钮的名字
clicked 点击事件
不信的话你可以试着点击ui界面的最底层区域,这样我们就能看到objectName的值是app了,当然,不要试图在你写代码期间修改这个媒介,否则,有你好受的…
void app::on_pushButton_file_clicked()
{
fileName = QFileDialog::getOpenFileName(this,tr("Open File"),".",tr("Images(*.png*.jpeg *.jpg)"));
//获取图片的路径 不过 一定要在“ app.h”里,加入以下头文件 #include <QFileDialog>
// #include <QDebug>
// #include <QFileInfo>
// 同时在‘app.h’的private中,加入: QString fileName; 否则会找不到这个名字从而报错
qDebug() << "fileName=" << fileName;
QFileInfo fi(fileName);
QString name = fi.fileName();
ui->label_filename->setText(name);
//QT 文件信息 将路径(fileName) 存储在 fi中, 然后 获取到fi里面的文件名称
//在这里,fi.fileName() 中的fileName并不是路径,而是路径中 所在的文件信息
//比如 fileName= "C:/Users/power/Pictures/0.jpg" 那么‘name’就是 0.jpg
//之后赋值给name,紧接着将这个name的值 送到 ui内的组件label_filename上,起名为 name
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上方,‘ui->label_filename’代表的是整个ui界面下,一个叫做label_filename的文本框,被设置了叫做‘name’的名字, 名字为选择图片的文件名,比如: 0.jpg
简单来说: 我所拖拽到ui界面中的所有控件,都是ui的儿子,那么 作为父亲是不是随时可以调用自己的儿子呢?(这点毋庸置疑)
效果图:
心细的在左上角会发现一个图片,那么,我们怎么导入这个图片,使得个性化呢
3.2 个性化窗口图片
右键这个工程文件->在出现的菜单中选择Add New选项,接着选择左侧Qt,在右侧选择Qt Resourse File,最后选择右下方choose按钮.接着在File name中写入文件名为images,(可以写别的文件名,并不一定要这个),下一步后点击完成.
这些操作都完成后,会在工程文件下出现Resources,并且在内部存在一个images.qrc文件
那么,我们接着右键->添加现有文件
随后会弹出一个窗口,在其中我们选择images,并选择其中的图片,这样图片就加载进来了.(一定要提前在这个工程文件下放入images文件夹,同时将文件夹中放入图片.)
之后在app.ui中,选中整个窗口,找到windowicon,然后点击三角,选择资源后,将图片放入.就有图标喽
RC_ICONS = images/logo.ico
1
如果想发布时带有图标,一定要在XX.pro文件内,写上这句话:
3.3 默认选中单选框
正常来说,我们会默认选中一个单选框,使得界面美观
这样,我们就默认选中64X64的了
3.4 预览图片
同上,选择‘预览图片’,右键 转到槽 ‘仍然是点击事件’,之后在‘app.h’中private属性下加入,并加入头文件:
void app::on_pushButton_showPic_clicked()
{
if(ui->radioButton_16->isChecked()){ //16X16被选中的话
picHeight = 16;
picWidth = 16;
}else if(ui->radioButton_32->isChecked()){
picHeight = 32;
picWidth = 32;
}else if (ui->radioButton_64->isChecked()) {
picHeight = 64;
picWidth = 64;
}else if (ui->radioButton_128->isChecked()) {
picHeight = 128;
picWidth = 128;
}else if (ui->radioButton_256->isChecked()) {
picHeight = 256;
picWidth = 256;
}
qDebug() << "picWidth:" << picWidth;
qDebug() << "picHeight:" << picHeight;
if(!fileName.isEmpty()){ //判断文件名是否为空
QPixmap map(fileName);
QPixmap newMap = map.scaled(picWidth,picHeight);
ui->label_picture_show->setPixmap(newMap);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
picHeight 自己设置的图片的高度
picWidth 自己设置的图片的宽度
isChecked 代表 是否选中当前的元素
总而言之,就是我选择其中一个按钮,然后根据自己设置的图片大小,设置你所展示的图片大小,比如: