您的位置:首页 > 编程语言 > Qt开发

QT之细节集锦

2017-08-10 19:23 176 查看

设置窗口无标题栏、linux下无任务管理器栏

setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint);


设置边框

setStyleSheet("border:3px groove #FF8C00");


使用setStyleSheet可以以html语法格式进行控件的各种外观定制,但需要注意的是父控件styleSheet属性会对子控件也生效,所以对有子控件的父控件需要慎用setStyleSheet

设置窗口透明度

setWindowOpacity(0.7);


这个方法只对具有Qt::Window窗口标识的窗口起作用,能够设置整个窗口的透明度,透过这个窗口可以看到其他的窗口

开启透明背景属性

setAttribute(Qt::WA_TranslucentBackground, true);


设置控件背景色和透明度

setAutoFillBackground(true);
QPalette pal = palette();
pal.setColor(QPalette::Background, Qt::black);
//pal.setColor(QPalette::Background, Qt::transparent);
//pal.setColor(QPalette::Background, QColor(255,0,0,128));
setPalette(pal);


注意不要忘了先setAutoFillBackground,通过设置控件的调色板即可实现改变背景色和透明度(rgba中的a通道)

setStyleSheet

设置背景和边框还可以使用setStyleSheet方法,但是这个方法会影响到所有的子控件,请慎用

pLabel->setStyleSheet("background-color: #00000000; border:2px solid gray;");


QWebEngineView设置透明

QWebEngineView除了本身需要使用setPalette设置调色板外,它还有一个page层,需要将它设为透明,默认是白色的背景色

m_webview->page()->setBackgroundColor(Qt::transparent);


控件全屏与退出全屏

void HMainWidget::onFullScreen(){
QWidget* pSender = (QWidget*)sender();

// m_rcSavedGeometry 用来保存控件原先的位置,退出全屏时还原
m_rcSavedGeometry = pSender->geo
4000
metry();

pSender->setWindowFlags(Qt::Window);
pSender->showFullScreen();
}

void HMainWidget::onExitFullScreen(){
QWidget* pSender = (QWidget*)sender();

pSender->setWindowFlags(Qt::SubWindow);
pSender->setGeometry(m_rcSavedGeometry);
pSender->showNormal();
}


全屏时需要先将该控件设置为窗口类型,调用showFullScreen才会生效,退出全屏时还原控件的类型和位置即可

信号与槽机制

注意的是信号与槽分为直接连接和异步连接,同一线程下创建的对象是直接连接,触发信号时会马上调用槽函数,但不同线程下的对象是异步连接,信号发出时会QCoreApplication::postEvent放入事件队列,直到取出时才会调用槽函数。

避免信号-槽死循环

当信号调用槽,而槽中又发出这个信号时,这时就会形成死循环,写槽函数发射信号时一定要注意。

事件accept

当一个事件不想在往父控件传递时,请使用accept

获取路径

qDebug()<<"applicationDirPath="<<QCoreApplication::applicationDirPath();
qDebug()<<"applicationFilePath="<<QCoreApplication::applicationFilePath();
qDebug()<<"currentPath="<<QDir::currentPath();


添加程序启动画面

QT中提供了QSplashScreen类来为你的应用程序添加启动画面,它可以通过setPixmap添加一张背景图片,showMessage显示一条消息,需要注意的是当你切换了图片或者消息时,需要调用QCoreApplication::processEvents去处理一次事件,示例代码入下:

QApplication app(argc, NULL);

QFont font = QApplication::font();
font.setPointSize(18);
QApplication::setFont(font);

int sw = QApplication::desktop()->width();
int sh = QApplication::desktop()->height();

QSplashScreen* splash = new QSplashScreen;
splash->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
splash->setGeometry(0,0,sw,sh);
splash->setStyleSheet("background-color: black");
splash->setPixmap("./splash.png");
splash->showFullScreen();
app.processEvents();

splash->showMessage("10% Loading icon...", Qt::AlignCenter, Qt::white);
app.processEvents();
HRcLoader::instance()->loadIcon();

splash->showMessage("30% Loading texture...", Qt::AlignCenter, Qt::white);
app.processEvents();
HRcLoader::instance()->loadTexture();

splash->showMessage("50% Creating main ui...", Qt::AlignCenter, Qt::white);
app.processEvents();
HMainWidget* mainwdg = new HMainWidget;
mainwdg->show();

splash->showMessage("100% Complete!", Qt::AlignCenter, Qt::white);
app.processEvents();
splash->finish(mainwdg);
delete splash;

app.exec();


HRcLoader和HMainWidget皆是我项目中定义的类,你不用管,换成自己的操作就行。

当然这个类只提供了基本的启动画面,如果想实现动态画面,需要自己去自定义组合控件了,比如添加label去显示动画,添加进度条去显示进度

设置QSlider样式

m_slider->setStyleSheet(
"QSlider::groove:horizontal {"
"   height: 16px;"
"   background: #C0C0C0;"
"   border: 1px solid green;"
"   border-radius: 5px;"
"   padding-left:-1px;"
"   padding-right:-1px;"
"}"
"QSlider::sub-page:horizontal"
"{"
"height: 16px;"
"background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4);"
"background: qlineargradient(x1:0, y1:0.2, x2:1, y2:1, stop:0 #5DCCFF, stop:1 #1874CD);"
"border: 1px solid #00FFFF;"
"border-radius: 2px;"
"}"
"QSlider::add-page:horizontal"
"{"
"height: 16px;"
"background: #575757;"
"border: 1px solid #00FFFF;"
"border-radius: 2px;"
"}"
"QSlider::handle:horizontal"
"{"
"width: 16px;"
"background: qradialgradient"
"("
"spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5,"
"stop:0.6 #FFD700, stop:0.778409 #696969"
");"
"margin-top: -8px;"
"margin-bottom: -8px;"
"border-radius: 5px;"
"}"
);


设置滚动条样式

setStyleSheet("QScrollBar:vertical"
"{"
"width:28px;"
"background:rgba(0,0,0,0%);"
"margin:0px,0px,0px,0px;"
"padding-top:28px;"
"padding-bottom:28px;"
"}"
"QScrollBar::handle:vertical"
"{"
"width:28px;"
"background:rgba(0,0,0,25%);"
" border-radius:4px;"
"min-height:20;"
"}"
"QScrollBar::handle:vertical:hover"
"{"
"width:28px;"
"background:rgba(0,0,0,50%);"
" border-radius:4px;"
"min-height:20;"
"}"
"QScrollBar::add-line:vertical"
"{"
"height:28px;width:28px;"
"subcontrol-position:bottom;"
"}"
"QScrollBar::sub-line:vertical"
"{"
"height:28px;width:28px;"
"subcontrol-position:top;"
"}"
"QScrollBar::add-line:vertical:hover"
"{"
"height:28px;width:28px;"
"subcontrol-position:bottom;"
"}"
"QScrollBar::sub-line:vertical:hover"
"{"
"height:28px;width:28px;"
"subcontrol-position:top;"
"}"
"QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical"

b6c1
"{"
"background:rgba(0,0,0,10%);"
"border-radius:4px;"
"}"
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: