设置无边框后怎么给QMainWindow加一个微信小程序标题栏设置

40772人阅读
QT Creator(4)
C/C++(4)
&&&& 学习Qt编程,有时候我们很想做出好看又比较炫的画面,这时就常用到qt上的一些技巧。
这里我以一个小例子来展示qt的这些技巧,此qt编程写的,如图:(去掉标题栏和设置窗口透明后)
本地网络聊天软件详见—含源代码
代码实现部分:
&span style=&font-size:14&&#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
#include&QLabel&
#include &QMouseEvent&
#include&QPalette&
namespace Ui {
class MainW
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *
private slots:
void on_pushButton_Set_clicked();
#endif // MAINWINDOW_H
 &/span&
mainwindow.cpp
&span style=&font-size:14&&#include &mainwindow.h&
#include &ui_mainwindow.h&
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
this-&setWindowTitle(&QQ &);
this-&setWindowIcon(QIcon(&:/images/po.jpg&));
this-&setWindowFlags(Qt::FramelessWindowHint);//去掉标题栏
this-&setGeometry(QRect(950, 55, 350, 250));//可设置窗口显示的方位与大小
//this-&setWindowOpacity(0.7);//设置透明1-全体透明
this-&setAttribute(Qt::WA_TranslucentBackground, true);//设置透明2-窗体标题栏不透明,背景透明
this-&resize(300,300);//显示大小
MainWindow::~MainWindow()
&main.cpp文件
&span style=&font-size:14&&#include &QtGui/QApplication&
#include &QTextCodec&
#include &mainwindow.h&
int main(int argc, char *argv[])
QApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(&GB2312&));
QTextCodec::setCodecForLocale(QTextCodec::codecForName(&GB2312&));
QTextCodec::setCodecForTr(QTextCodec::codecForName(&GB2312&));
return a.exec();
本例中用到的透明是&: 窗体标题栏不透明,背景透明。
这里介绍几种设置透明效果的用法:
1.this-&setWindowOpacity(0.7);//全体透明(指的是窗体,标题栏以及上面所有的控件都透明)里面的参数可以控制透明度。
2.窗口整体透明,但是窗体上的控件不透明。 通过设置窗体的背景色来实现,将背景色设置为全透:
代码如下:
&span style=&font-size:14&& pal = palette();
pal.setColor(QPalette::background, QColor(0x00,0xff,0x00,0x00));
setPalette(pal);&/span&
3.窗体标题栏不透明,背景透明。(本例中用到的)
this-&setAttribute(Qt::WA_TranslucentBackground,true);
4.窗口整体不透明,局部透明:在Paint事件中使用Clear模式绘图。
&span style=&font-size:14&&void mainwindow::paintEvent( QPaintEvent* )
{ QPainter p(this);
p.setCompositionMode( QPainter::CompositionMode_Clear );
p.fillRect( 30, 30, 300, 300, Qt::SolidPattern );
绘制区域全透明,如果绘制区域有控件不会影响控件的透明。
5.这里说一下本程序中怎样去掉标题栏
this-&setWindowFlags(Qt::FramelessWindowHint);//去掉标题栏
转载注明:
就写到这里了,亲,有收获吗?
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:217202次
积分:2209
积分:2209
排名:第16486名
原创:24篇
评论:247条
(1)(1)(2)(1)(9)(4)(2)(5)(3)(2)(3)& & & &通过qss自定义外观后,发现标题栏的外观未发生变化,与整体的风格不融洽。因为程序的最外层边框加载的是系统本地的窗口。为了使风格统一,我们可以自定义一个标题栏来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭的按钮,并控制其风格与主界面一致。
& & & &网上有很多Qt自定义标题栏的代码。这里分享一个我觉得较好的自定义标题栏。与其他代码不同,其把对主窗口的相关处理事件都封装在标题栏类中,使用的时候,通过安装事件监听器来完成对主窗的控制。效果如下图所示:
& & & & & & & & & & & & & & &系统边框 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 自定义边框
上面是对对话框自定义标题栏,使用时,除了安装监听器,需要把标题栏放置在对话框布局的顶端
这里额外说明是对QmainWindow添加自定义边框,在对QmainWindow类调用this-&layout返回的是空,得不到其布局,QMainWindow的布局是已经定义好的,不能够进行改变。为了能添加自定义边框,在外面加了一个QWidget. 将自定义标题栏和QMainWindow添加到QWidget中。同时为了使得Qmainwindow能够嵌入到QWidget中,需要添加如下设置:
参考文献:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33380次
积分:1408
积分:1408
排名:千里之外
原创:97篇
转载:24篇
评论:12条
(3)(7)(5)(5)(6)(1)(13)(6)(14)(11)(4)(1)(11)(9)(10)(15)8283人阅读
UI设计是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性、有品位,还要让软件的操作变得舒适简单、自由,充分体现软件的定位和特点。
爱美之心人皆有之。其实软件界面就像工业造型一样,是产品的重要卖点。一个产品拥有美观的界面会给人带来舒适的视觉享受,拉近人与产品的距离,是建立在科学性之上的艺术设计。
检验一个界面的标准-既不是某个项目开发组领导的意见,也不是项目成员投票的结果,而是终端用户的感受。
所以,对于大多数商业软件或者专业产品来说,Qt的本地化样式显然已经不能满足期望,我们需要进行大量的样式美化,才能够让它更有个性、有品位。
下面我们来实现这样一个界面。
设置窗口标志为无边框
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
关于WindowFlags枚举值很多,其中有一个WindowStaysOnTopHint,可以让窗体位于所有界面之上,类似于QQ主面板,一打开就在所有软件之上-比较霸道。
设置无边框之后,窗体是无法移动的,下面我们介绍两种方式来进行移动。
void Widget::mousePressEvent(QMouseEvent *event)
if (event-&button() == Qt::LeftButton)
m_bPressed = true;
m_point = event-&pos();
void Widget::mouseMoveEvent(QMouseEvent *event)
if (m_bPressed)
move(event-&pos() - m_point + pos());
void Widget::mouseReleaseEvent(QMouseEvent *event)
Q_UNUSED(event);
m_bPressed = false;
包含头文件与需要用到的库
#ifdef Q_OS_WIN
#pragma comment(lib, "user32.lib")
#include &qt_windows.h&
发送系统消息,进行移动
void Widget::mousePressEvent(QMouseEvent *event)
#ifdef Q_OS_WIN
if (ReleaseCapture())
SendMessage(HWND(winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
event-&ignore();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
Qter,还在等什么,赶快加入吧!
Qt分享&&交流
QML分享&&交流
访问:1553194次
积分:20149
积分:20149
排名:第378名
原创:375篇
评论:1505条
本博客中所有原创文章及译文均采用进行许可
文章:13篇
阅读:11658
文章:14篇
阅读:20260
文章:39篇
阅读:63814
文章:44篇
阅读:44776
阅读:31781
阅读:12535
文章:215篇
阅读:1106370
(7)(8)(11)(11)(21)(2)(11)(10)(18)(29)(37)(24)(59)(27)(19)(9)(28)(5)(15)(12)(17)16:28 提问
画一个无标题栏无边框的窗口
窗口是用gdi+画的
打算是想实现一种想安全卫士之类的窗口 没有默认的标题栏和边框的
现在的情况是 按钮被挡住了 画不出来?
// WinCreate.cpp : Defines the entry point for the application.
#include //初始化一下com口
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#include "GdiPlus.h"
using namespace G
#pragma comment(lib, "gdiplus.lib")
//用于接收应用程序实例句柄
HINSTANCE g_hInstance = 0;
GdiplusStartupInput m_gdiplusStartupI
ULONG_PTR m_pGdiT
void OnCreate(HWND hWnd)
CreateWindowEx( 0, "BUTTON", "OK",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW,
0, 0, 50, 30, hWnd, (HMENU)1000, g_hInstance, NULL );
//窗口处理函数(用于处理消息)
LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,
WPARAM wParam, LPARAM lParam)
switch(nMsg)
case WM_CREATE:
GdiplusStartupInput m_gdiplusStartupI
ULONG_PTR m_pGdiT
Gdiplus::GdiplusStartupInput gdiplusStartupI
Gdiplus::GdiplusStartup(&m_pGdiToken, &m_gdiplusStartupInput, NULL);
BLENDFUNCTION m_B
HDC m_hdcM
//初始化GDI+.
m_Blend.BlendOp=0;
m_Blend.BlendFlags=0;
m_Blend.AlphaFormat=1;
m_Blend.SourceConstantAlpha=255;
//窗体样式为0x80000为层级窗体
DWORD dwExStyle=GetWindowLong(hWnd,GWL_EXSTYLE);
SetWindowLong(hWnd,GWL_EXSTYLE,dwExStyle|0x80000);
//绘制内存位图
HDC hdcTemp=GetDC(hWnd);
m_hdcMemory=CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,417,128);
SelectObject(m_hdcMemory,hBitMap);
//使用GDI+载入PNG图片
HDC hdcScreen=::GetDC (hWnd);
RECT rct={0,0};
::GetWindowRect(hWnd,&rct);
POINT ptWinPos={rct.left,rct.top};
Graphics graph(m_hdcMemory);
Image image(L"2.png",TRUE);
graph.DrawImage(&image,0,0,417,128);
//使用UpdateLayerWindow进行窗口透明处理
HMODULE hFuncInst=LoadLibrary("User32.DLL");
typedef BOOL (WINAPI MYFUNC)(HWND,HDC,POINT,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);
MYFUNC UpdateLayeredW
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst,"UpdateLayeredWindow");
SIZE sizeWindow={417,128};
POINT ptSrc={0,0};
UpdateLayeredWindow( hWnd,hdcScreen,&ptWinPos,&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);
LONG nOldStyle = ::GetWindowLong (hWnd, GWL_STYLE);
::SetWindowLong (hWnd, GWL_STYLE, nOldStyle & ~WS_CAPTION);
::SetWindowPos (hWnd, HWND_TOPMOST, 100,100, 417,128, SWP_SHOWWINDOW);
DeleteObject(m_hdcMemory);
DeleteObject(hBitMap);
case WM_DESTROY:
GdiplusShutdown(m_pGdiToken);
PostQuitMessage(0);
return DefWindowProc(hWnd, nMsg, wParam, lParam);
//注册窗口类
BOOL Register(LPSTR lpClassName, WNDPROC wndProc)
WNDCLASSEX wce = {0};
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hI
wce.lpfnWndProc = wndP
wce.lpszClassName = lpClassN
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if(nAtom == 0)
return FALSE;
return TRUE;
//创建主窗口
HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName)
HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName,
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,g_hInstance,NULL);
//显示窗口
void Display(HWND hWnd)
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
//消息循环
void Message()
MSG nMsg = {0};
while(GetMessage(&nMsg,NULL,0,0))
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
g_hInstance = hI
if(!Register("Main",WndProc))
MessageBox(NULL,"Register Fail","Infor",MB_OK);
HWND hWnd = CreateMain("Main","window");
Display(hWnd);
Message();
其他相似问题

我要回帖

更多关于 标题栏划过加边框 的文章

 

随机推荐