動(dòng)態(tài)網(wǎng)站開發(fā)常用技術(shù)龍網(wǎng)網(wǎng)絡(luò)推廣軟件
繼續(xù)講一些Qt開發(fā)中的技巧操作:
1.文字的分散對(duì)齊
有時(shí)候需要對(duì)文本進(jìn)行分散對(duì)齊顯示,相當(dāng)于無論文字多少,盡可能占滿整個(gè)空間平攤占位寬度,但是在對(duì)支持對(duì)齊方式的控件比如QLabel調(diào)用 setAlignment(Qt::AlignJustify | Qt::AlignVCenter)設(shè)置分散對(duì)齊會(huì)發(fā)現(xiàn)沒有任何效果,這個(gè)時(shí)候就要考慮另外的方式比如通過控制字體的間距來實(shí)現(xiàn)分散對(duì)齊效果。
QString text = "測試分散對(duì)齊內(nèi)容";
//計(jì)算當(dāng)前文本在當(dāng)前字體下占用的寬度
QFont font = ui->label->font();
int textWidth = ui->label->fontMetrics().width(text);
//顯示文本的區(qū)域?qū)挾?#61;標(biāo)簽的寬度-兩邊的邊距
int width = ui->label->width() - 12;
//需要-1相當(dāng)于中間有幾個(gè)間隔
int count = text.count() - 1;
//計(jì)算每個(gè)間距多少
qreal space = qreal(width - textWidth) / count;
//設(shè)置固定間距
font.setLetterSpacing(QFont::AbsoluteSpacing, space);
ui->label->setFont(font);
ui->label->setText(text);
2.設(shè)置動(dòng)態(tài)庫路徑
Qt提供的設(shè)置動(dòng)態(tài)庫路徑的方法setLibraryPaths是用來搜索插件動(dòng)態(tài)庫的,而不是程序直接依賴的動(dòng)態(tài)庫;很多人以為這個(gè)可以設(shè)置Qt的庫或者程序中依賴的第三方庫的路徑,其實(shí)想想也知道,因?yàn)槌绦蛞蕾囘@個(gè)庫,找不到的話根本跑不起來,程序跑不起來怎么應(yīng)用執(zhí)行這個(gè)代碼呢;Qt默認(rèn)是可用通過setLibraryPaths的方式設(shè)置Qt插件的動(dòng)態(tài)庫目錄位置,比如數(shù)據(jù)庫插件sqldrivers,軟鍵盤的插件庫等等,因?yàn)檫@些庫文件是真正在Qt程序跑起來以后通過插件形式去加載的;還可以通過qt.conf文件設(shè)置 Plugins=“config” 指定所有插件在可執(zhí)行文件下的config目錄下;要想設(shè)置程序直接依賴的動(dòng)態(tài)庫在其他目錄,找遍所有也只有一個(gè)辦法,那就是設(shè)置環(huán)境變量,除此別無他法。至于如何設(shè)置環(huán)境變量方式很多,比如手動(dòng)在電腦上設(shè)置,或者搞個(gè)批處理文件執(zhí)行命令行,在程序安裝的時(shí)候自動(dòng)執(zhí)行,或者程序打包目錄下用戶手動(dòng)運(yùn)行這個(gè)批處理。最終找插件的路徑其實(shí)就是這個(gè) QT_PLUGIN_PATH 環(huán)境變量;設(shè)置插件的目錄還可以通過在main函數(shù)最前面這樣寫來實(shí)現(xiàn)。
int main(int argc, char *argv[])
{//啟動(dòng)鍵盤,Qt默認(rèn)鍵盤qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
3.進(jìn)度條控件的文本
進(jìn)度條控件如果設(shè)置的垂直方向,就算你設(shè)置了文本可見,會(huì)發(fā)現(xiàn)根本看不到進(jìn)度文本,經(jīng)過多方百折不撓的試探,以及查看其他大佬的文章,發(fā)現(xiàn)只要設(shè)置下border樣式(border:1px solid #ff0000、border:none、border-style:solid、border-radius:0px 任意一種)就行,就可以把文本顯示出來;
4.文件對(duì)話框的卡頓
我們?cè)谑褂肣FileDialog::getOpenFileName、QFileDialog::getExistingDirectory等方法時(shí),有時(shí)候會(huì)發(fā)現(xiàn)首次打開很卡,尤其是在默認(rèn)目錄很多文件的時(shí)候,此時(shí)你可以考慮設(shè)置這些函數(shù)最末尾的參數(shù)為QFileDialog::DontUseNativeDialog,表示不采用本地系統(tǒng)對(duì)話框,這樣的話會(huì)采用Qt的對(duì)話框,速度快很多,估計(jì)系統(tǒng)的對(duì)話框在打開的時(shí)候會(huì)做很多初始化加載處理;
QFileDialog::getOpenFileName(this, "", "", "", 0, QFileDialog::DontUseNativeDialog);
QFileDialog::getExistingDirectory(this, "", "", QFileDialog::DontUseNativeDialog);
5.滑塊控件的進(jìn)度顏色
滑塊控件QSlider,如果設(shè)置的垂直樣式,其進(jìn)度顏色和剩余顏色,剛好和橫向樣式的顏色相反的,不確定這個(gè)是否是Qt的BUG,Qt各版本都存在這個(gè)現(xiàn)象
QSlider::groove:horizontal{
height:8px;
background:#FF0000;
}
QSlider::add-page:horizontal{
height:8px;
background:#FF0000;
}
QSlider::sub-page:horizontal{
height:8px;
background:#00FF00;
}
QSlider::handle:horizontal{
width:10px;
background:#0000FF;
}
QSlider::groove:vertical{
width:8px;
background:#FF0000;
}
QSlider::add-page:vertical{
width:8px;
background:#00FF00;
}
QSlider::sub-page:vertical{
width:8px;
background:#FF0000;
}
QSlider::handle:vertical{
height:10px;
background:#0000FF;
}
6.停靠窗體的排列
QMainWindow 在對(duì)??看绑w進(jìn)行排列的時(shí)候,有些不常用的設(shè)置容易遺忘,建議將QMainWindow 的頭文件函數(shù)過一遍一目了然;
//設(shè)置允許各種嵌套比如上下排列左右排列非常靈活
//此設(shè)置會(huì)和下面的 setDockOptions 中的參數(shù)覆蓋所以要注意順序
//this->setDockNestingEnabled(true);
//設(shè)置??繀?shù),不允許重疊,只允許拖動(dòng)和嵌套
this->setDockOptions(AnimatedDocks | AllowNestedDocks);
//將底部左側(cè)作為左側(cè)區(qū)域,底部右側(cè)作為右側(cè)區(qū)域,否則底部區(qū)域會(huì)填充拉伸
this->setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
this->setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
7.拖拽事件的坑
很多人以為拖曳只要在dropEvent事件就可以了,其實(shí)不行的,沒有效果的,需要先在
dragEnterEvent事件中執(zhí)行event->accept()才行,不然根本沒有效果,很多人尤其是初學(xué)者都掛在這里,我在這里也掉過坑。
void frmMain::dropEvent(QDropEvent *event)
{QList<QUrl> urls = event->mimeData()->urls();
}
void frmMain::dragEnterEvent(QDragEnterEvent *event)
{if(event->mimeData()->hasFormat("application/xqabstractitemmodeldatalist")) {event->setDropAction(Qt::MoveAction);event->accept();} else {event->ignore();}
}