QT使用的积累(2020年04月11日更新)

**以下是我半年多以来工作中使用QT的一些方法积累放在这,备忘。**长期更新。。。

####1.想得到qstring所占空间的长度:(一般在paintEvent(QPaintEvent *e)函数体中)<::>QFontMetrics ft = p.fontMetrics();
QString name = ”一个字符串”;
int width=ft.width(name);//width是字符串name所占的像素个数<-`

####2.设置一个cpp文件中QT部件的样式:(多个部件一起设)
>:setStyleSheet( "QListWidget::item{border: 1px solid #dadada;}" "QListWidget::item:selected{background:1px solid #b3e5fc;outline:0px;}" "QCheckBox{font-family:'Microsoft YaHei'; font-size:12px;}" "QGroupBox{font-family:'Microsoft YaHei';font-size:12px;color:#000000;}" "QRadioButton{font-family:'Microsoft YaHei'; font-size:12px;}" );<-

####3.给一个QComboBox设置成自己想要的样式:(主要就是难点是设置下拉列表每一项的height)
(1). 有icon的样式:
>:QCombox combox; combox.addItem(QString::fromLocal8Bit(“中英文都可以的字符串1”)); combox.addItem(QString::fromLocal8Bit(“中英文都可以的字符串2”));//给combox下拉列表设置为两行 combox.setItemIcon(0,QIcon(":/gui/art/iframe/meeting.png"));//从0开始 combox.setItemIcon(1, QIcon(":/gui/art/iframe/phone.png"));//分别设置icon combox.setIconSize(QSize(25, 25));//设置icon大小使下拉列表每行height都一样 combox.setStyleSheet( "QComboBox{border:1px solid gray;}" "QComboBox{border-radius: 0px;}" "QComboBox{background:qlineargradient(x1:0,y1:0,x2:2,y2:2,stop:0.4 #ffffff);}" "QComboBox{width:180px;}" "QComboBox{top:1px;left:1px;}" "QComboBox::drop-down{border-style:none;}" "QComboBox::down-arrow{image:url(:/gui/art/iframe/dropicon.png);}"//自定义向下箭头 );<-
(2). 没有icon的样式设置,只是把下拉列表每一项height设大:(设置(1,25)的icon)
>:QCombox combox; QPixmap pixmap(1, 25); Pixmap.fill(Qt::transparent); QIcon icon(pixmap); combox.setIconSize(QSize(1, 25)); combox.setItemIcon(i, icon);<-

####4.给某一个部件设置字体:
setFont(QFont(“Microsoft YaHei”,12,QFont::Normal));

####5.堆栈窗口的实现(左侧是QListWidget,右侧是一叠QWidget):
QListWidget m_pList = new QListWidget;

>:QListWidgetItem* firstItem = new QListWidgetItem(QIcon(“:/gui/art/iframe/settings.png”),qsl(“列表第一项”),m_pList); QListWidgetItem* secondItem = new QListWidgetItem(QIcon(“:/gui/art/iframe/settings.png”),qsl(“列表第二项”),m_pList);<-

>:firstItem->setSizeHint(QSize(100,50));//设置每项大小 secondItem->setSizeHint(QSize(100,50));<-

>:m_pList->setIconSize(QSize(40,40));//设置每一项中图标大小 m_pList->setSpacing(5);//设置列表项之间的间隔 m_pList->setFocusPolicy(Qt::NoFocus);//去掉选中效果(虚线框)<-

m_pList->insertItem(0, firstItem);//把每一项插入QListWidget m_pList->insertItem(1, secondItem);
///
以上是左侧列表的实现,以下是右侧堆栈窗口的实现:
QStackedWidget stackWidget = new QStackedWidget(this); QWidget widget1 = new QWidget(this); QWidget widget2 = new QWidget(this);

stackWidget->addWidget(widget1);//给堆栈窗口分别设置widget stackWidget->addWidget(widget2);
//
//布局(设置QListWidget与QStackedWidget的位置)
QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(m_pList); layout->addWidget(stackWidget); layout->setMargin(0); layout->setSpacing(0); layout->setStretchFactor(m_pList, 1); layout->setStretchFactor(stackWidget, 3);//左右布局1:3
//下面这句使左侧列表与右侧堆栈窗口一一对应起来
connect(m_pList, SIGNAL(currentRowChanged(int)), stackWidget, SLOT(setCurrentIndex(int))); //OVER!!!

####6.设置菜单的位置:
QPoint pos; QMenu menu = new QMenu(this); int x=pos.x(); int y=pos.y(); pos.setX(x); pos.setY(y + this->geometry().height() + 1); menu->exec(mapToGlobal(pos));

####7.设置菜单的样式:
setStyleSheet( "QMenu{padding:0px;background:#ffffff;color:#000000;}" "QMenu::item:selected{background-color:#aedcf6;color:#000000;}" "QMenu::item{padding:10px 0px 10px 20px;font-size:14px;}" "QMenu::item{border-bottom:1px solid #eeeef4;}" );

####8.在使用QRadioButton的时候需要注意的问题,在同一个widget中只能有一个radioButton->ischecked()为真,所以需要对QRadioButton分组。一般是通过QGroupBox对radioButton分组,但是这种方法会产生一个方框把radioButton给框起来了,看到网上的一种方法是每组radioButton分别有一个父窗口QWidget. 下面是通过QGroupBox分组的例子:
>:radioButton1 = new QRadioButton(“”, parentGroupBox1); radioButton2 = new QRadioButton(“”, parentGroupBox2);<-

####9.如果想修改图片的格式,直接修改扩展名是不行的,文件可能被破坏。需要用修图软件打开并另存为需要的格式。切记!

####10.想要实现窗口的拖动操作实现如下:
void QSLabel::mouseMoveEvent(QMouseEvent *e) { if(e->buttons()&&Qt::LeftButton) { move(e->globalPos() - dragPosition); e->accept(); } } void QSLabel::mousePressEvent(QMouseEvent* e ) { if(e->button()==Qt::LeftButton) { dragPosition=e->globalPos() - frameGeometry().topLeft(); e->accept(); } }

####11.实现QT原生部件的背景透明。(以QTextEdit为例)
>:QTextEdit *m_textEdit=new QTextEdit(this); QPalette pl=m_textEdit->palette(); pl.setBrush(QPalette::Base,QBrush(QColor(255,0,0,0))); m_textEdit->setPalette(pl);<-

####12.使QTextEdit中显示的文字自动换行类似于方形:
>:m_textEdit->resize(sqrt(m_textEdit->toPlainText().size())*15+30,m_textEdit->document()->size().rheight()+10);<-

####13.要将一段文字绘制在一个矩形区域内部的做法:(KEY:Qt::TextWrapAnywhere)
p.drawText(rect, Qt::TextWrapAnywhere, string);

####14.要使窗口半透明可以在paintEvent(QPaintEvent *e)方法中调用
p.setOpacity(float/*透明度*/);
####15.QT中设置应用的风格:
QApplication::setStyle(“windowxp”);//XP风格,(体现在QT原生部件的显示上) 可以是“windows”、“motif”、“cde”、“plastique”、“windowsxp”、“macintosh”。

####16.设置QLabel样式:
Label->setText("<b><font color=blue size=30>test!</font></b>");//修改文字颜色及大小 Label->setPixmap(QPixmap(“:res/logo_png”));//显示图片 Label->setScaledContents(true);//图片适应label大小(在显示图片前调用) Label->setWordWrap(true);//文字自动换行 Label->setAlignment(Qt::AlignLeft);//设置字体靠左 Label->setTextInteractionFlags(Qt::TextSelectableByMouse);//设置文本内容可选

####17.制作程序启动页面:
#include <QtGui/QApplication>
#include <QSplashScreen>
#include <QTimer>
#include "mainwindow.h"
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    MainWindow w;

    QPixmap pixmap(":res/bg");
    QSplashScreen splash(pixmap);
    splash.show();

    QTimer::singleShot(1500, &splash, SLOT(hide()));
    QTimer::singleShot(2000, &w, SLOT(show()));

    return a.exec();
}`

####18.设置快捷键:
QAction *hotkey=new QAction(this); Hotkey->setShortCut(QKeySequence(Qt::CTRL=Qt::Key_F)); App::wnd()->addAction(hotkey); Connect(hotkey,SIGNAL(triggered()),btn,SIGNAL(clicked()));//等同于点击btn的clicked()信号。

####19.去除窗口的最大最小化按钮:
setWindowFlags(windowFlags()&Qt::WindowMaximizeButtonHint&Qt::WindowMinimizeButtonHint);

####20.调用QMessageBox的时候,主程序在托盘运行,点击这个对话框上的取消按钮,或是直接点击关闭,整个程序就退出了。
解决方法是在QMessageBox弹出前加一句:(最好是给main()里面添加,这样只需要加一次就可以了)
QApplication::setQuitOnLastWindowClosed(false);

####21.给列表项添加右键菜单:
void ConversationList::mousePressEvent(QMouseEvent *e) { _mouseSel = true; _lastMousePos = e->globalPos(); If(e->button() == Qt::MouseButton::RightButton ) { QMenu popMenu; m_act = popMenu.addAction(qsl(“ 删除这一项”)); popMenu.setFixedSize(st::meetingListMenuSize); popMenu.setFont(QFont(“Microsoft YaHei”, 11, QFont::Normal)); popMenu.setCursor(Qt::PointinghandCursor); popMenu.setStyleSheet( "QMenu{padding:0px;background:#ffffff;color:#000000;border:0px solid gray;}" "QMenu::item:selected{background-color:#f5f5f5;color:#000000;}"); if(m_act == popMenu.exec(_lastMousePos)) { emit clickDelDialog(gldId); } } }
####22.QMenu样式设置:
//菜单
QMenu
{
border-width:2;
border-image:url(:/Demo/Resources/common_menuborder.png);
}
QMenu::item //菜单节点
{
padding: 6px 24px 6px 28px;
}

QMenu::icon //设置菜单中图标位置调整
{
padding: 0px 0px 0px 9px;
}

QMenu::separator //添加分割线
{
margin-left:24;
margin-right:4;
border-image: url(:/Demo/Resources/menu_separate.png);
}
QMenu::item:selected//菜单节点选中效果
{
border-image:url(:/Demo/Resources/menu_hover.png);
padding: 6px 24px 6px 28px;
}
QMenu::item:hover //菜单节点滑过效果
{
border-image:url(:/Demo/Resources/menu_hover.png);
padding: 6px 24px 6px 28px;
}
####23.QLabel实现可点击触发链接:
QString str=QString("<a style=“font-size:16px; color:rgb(82,179,254)”; href=“链接名称”>打开链接");
QLabel *lb=new QLabel(str, this);
connect(lb,SIGNAL(linkActivated(QString)),this, SLOT(openLink(QString)));
####24.百度地图获取源代码的Url:
获取模块
http://api0.map.bdimg.com/getmodules?v=2.0&t=20140707&mod=newvectordrawlib_hmclwu
获取API:
http://api.map.baidu.com/getscript?v=2.0&ak=&services=&t=20170628183224
http://api.map.baidu.com/api?v=2.0
####25.qtConcurrent的使用:
//demo.pro
QT += concurrent widgets
SOURCES += main.cpp
TARGET = demo
TEMPLATE = app

//main.cpp
#include
#include
#include

int main(int argc, char **argv)
{
QApplication app(argc, argv);
const int iterations = 400;
QVector vector;
for (int i = 0; i < iterations; ++i)
{
vector.append(i);
}
QProgressDialog dialog;
dialog.setAutoClose(false);
dialog.setAutoReset(false);
dialog.setLabelText(QString(“Progressing using %1 thread(s)…”).arg(QThread::idealThreadCount()));
QFutureWatcher futureWatcher;
QObject::connect(&dialog, &QProgressDialog::canceled, &futureWatcher, &QFutureWatcher::cancel);
QObject::connect(&futureWatcher, &QFutureWatcher::progressRangeChanged, &dialog, &QProgressDialog::setRange);
QObject::connect(&futureWatcher, &QFutureWatcher::progressValueChanged, &dialog, &QProgressDialog::setValue);
// QObject::connect(&futureWatcher, &QFutureWatcher::finished, &dialog, &QProgressDialog::hide);
std::function<void(int&)> spin = [](int &iteration)
{
const int work = 1000 * 1000 * 40;
volatile int v = 0;
for (int j = 0; j < work; ++j)
{
++v;
}
qDebug() << “iteration” << iteration << “in thread” << QThread::currentThreadId();
};
futureWatcher.setFuture(QtConcurrent::map(vector, spin));
dialog.exec();
futureWatcher.waitForFinished();
qDebug() << “Canceled?” << futureWatcher.future().isCanceled();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值