QLineEdit限制输入
有三种方法:
- 用QList写入限制符,将输入的内容遍历排除
QRegExp tempREg;
tempREg.setPattern("^(\\d)+(.)*");
unusedRegList.append(tempREg);
tempREg.setPattern("^(\\s)+(.)*");
unusedRegList.append(tempREg);
tempREg.setPattern("(.)*(\")+(.)*");
unusedRegList.append(tempREg);
unusedSymbolList << tr(",") << tr(".") << tr("~") << tr("!") << tr("@") << tr("#") << tr("$") << tr("%") << tr("`") << tr("^") << tr(" ")
<< tr("&") << tr("*") << tr("(") << tr(")") << tr("{") << tr("}") << tr("[")
<< tr("]") << tr("<") << tr(">") << tr("\\") << tr("|") << tr("+") << tr("=") << tr(":") << tr(";") << tr("/") << tr("?");
unusedNameList << "auto" << "double" << "int" << "struct" << "break" << "else" << "long"
<< "switch" << "case" << "enum" << "register" << "typedef" << "char" << "extern" << "return"
<< "union" << "const" << "float" << "short" << "unsigned" << "continue" << "for"
<< "signed" << "void" << "default" << "goto" << "sizeof" << "volatile" << "do" << "if" << "while" << "static";
- 用正则表达式
QRegExp rx("[\\u4e00-\\u9fa5]*|\\w*|\\d*|_*");
QRegExpValidator *ipRegExpValidator = new QRegExpValidator(rx, this);
ui->lineEdit->setValidator(ipRegExpValidator);
正则表达式包括表达式、量词、断言。"[^AEIOU]"匹配非元音字母;E+匹配1次或多次,E*匹配0次或多次;(?!E)表达式不跟随E才匹配。
3. 设置输入法禁用
ui->lineEdit->setAttribute(Qt::WA_InputMethodEnabled, false);
QT—Tips
- QML不能嵌入非QML窗口,渲染机制不同。
- QVarient存放其他各种类型数据。
- QString的隐式共享将深拷贝和浅拷贝有机结合;含有内存分配策略。
- Qt::WindowsFlags 枚举类型。
- QT5基本对话框:文件选择、颜色选择、字体选择、标准输入(字符串、下拉表条目、int类型、double类型输入)、标准消息(Question、Information、Warning、Critical、About)。
- QPalette对话框或控件的调色板管理控件或窗体的颜色信息。
QStringList colorList = QColor::colorNames();
QColor color = QColor(colorList[i]);
QPalette p = widget->palette();
p.setColor(QPalette::Button,color);
widget->setPalette(p);
widget->update();
- 不规则窗体利用
setMask(QBitmap(pix.mask()))
为窗体设置遮罩,遮住所选区域以外的部分使其看起来是透明的。 - 程序启动画面——QSplashScreen
#include <QSplashScreen>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPixmap pixmap("a.png");
QSplashScreen splash(pixmap);
splash.show();
a.processEvents();
ToolPage w;
w.show();
splash.finish(&w);
return a.exec();
}
- 文本打印——QPrinter\QPrinterDialog
- QMartix类提供世界坐标系统的二维转换,使窗体转换变形。 setScaledContents设置控件的scaledContents属性。
QImage img;
QMatrix martix;
martix.scale(0.5,0.5); //缩放功能
martix.rotate(270); //旋转功能
img.mirrored(false,true); //纵向镜像
img.mirrored(true,false); //横向镜像
img.transformed(martix);
- 文本编辑用QTextEdit作为输入文本的容器,里面输入的可编辑文本有QTextDocument作为载体,用来表示QTextDocument的元素的QTextBlock、QTextList、QTextFrame是它不同表现形式,每种元素有不同的表现格式,例如QTextBlock对应QTextBlockFormat。QTextCursor是编辑文本的光标,提供了QTextDocument的修改接口。QTextListFormat通过QTextCursor实现QTextDocument的文本排序。
- Qt 5双缓冲机制,先将绘制内容绘制在一个图片中,再将图片一次性绘制到控件上。
- 点击事件记录起始位置,鼠标移动事件绘制线段。
- 分析窗体层次区域及其之间关系,再设计各窗体内部结构。
- 以QPixmap对象为QPaintDevice参数绘制,在构造一个QPainter对象时立即开始对绘画设备进行绘制。此构造对象是短时期的,如在paintEvent()只调用一次,所以写了painter->start(),painter->end()。
- SVG是可缩放的矢量图形,QT提供了QtSvg模块显示此格式图片,主要有QSvgWidget,QSvgRender,QGraphicsSvgItem。继承QSvgWidget类重写鼠标滚轮事件,QSvgRender::defaultSize()获取图片大小;继承QScrollArea显示SVG。
- QT解析XML:DOM和SAX。DOM将xml表示为一棵树,以便随机访问其中的节点但内存消耗相对多一些。SAX是一种事件驱动的XML API。SVG是用XML表示的矢量图形文件。
- QCheckBox居中方式:
①加样式表:QCheckBox::indicator{ subcontrol-position:center center;}
②放在QWidget加弹簧:
QWidget *widget = new QWidget;
QHBoxLayout *layout = new QHBoxLayout;
layout->setSpacing(0);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(box);
layout->addStretch();
widget->setLayout(layout);
ui->tableWidget->setCellWidget(i, 0, widget);
Graphics View框架结构
- Graphics View框架结构:QGraphicsScene场景类提供了用于管理位于其中的众多QGraphicsItem图元容器类,QGraphicsView视图类用于显示场景中的图元,一个场景可以通过多个视图表现并包含多个几何图形。
- QGraphicsScene::focusItem(),QGraphicsScene::selectedItems()。
- QGraphicsView是可滚动的窗口部件,如果要用OpenGL,可以用QGraphicsView::setViewport()将视图设置为QGLWidget,接收键盘和鼠标的输入事件,将他们翻译为场景事件(将坐标转换为场景坐标):QGraphicsView::mapToScene()。
- QGraphicsItem处理自己的鼠标键盘事件,有自己的坐标系统,也提供场景和图元,通过QGraphicsItem::martix()来进行自身的交换,包括子图元。
- 所有鼠标事件最开始都使用视图坐标,视图坐标是窗口部件的坐标。创建图元后只需注意图元坐标就好,QGraphicsScene和QGraphicsView会完成所有的变换,调用QGraphicsItem::paint()会以图元坐标系为基准。QGraphicsItem::mapToParent()则将某点坐标映射到上一级坐标系中,也可能是场景坐标,也可能是另一个QGraphicsItem坐标。
对QTreeWidget的项搜索功能
做的时间复杂度有点高,有更好的欢迎在评论区讨论 (。・ω・。)
QList<QTreeWidgetItem *> items = m_ui->treeWidget->findItems(name, Qt::MatchExactly | Qt::MatchRecursive);
int count = items.count();
if (items.count() > 0)
{
m_ui->treeWidget->setCurrentItem(items.at(0));
}
int iNum, jNum, kNum,lNum;
QTreeWidgetItem *item0,*item1, *item2, *item3,*item4;
//根节点下所有子节点的个数
item0 = m_ui->treeWidget->topLevelItem(0);
iNum = item0->childCount();
//遍历根节点下的所有子节点
if (!m_item.isEmpty()){
for (int i = 0; i < iNum; i++)
{
//根节点下当前遍历到的子节点
item1 = item0->child(i);
//判断该节点是否是要找的节点
if (item1->text(0) == m_item[0])
{
jNum = item1->childCount();
if (jNum == 0)
{
m_ui->treeWidget->setCurrentItem(item1);
break;
}
for (int j = 0; j < jNum; j++)
{
item2 = item1->child(j);
if (item2->text(0) == m_item[1])
{
kNum = item2->childCount();
for (int k = 0; k < kNum; k++)
{
item3 = item1->child(j)->child(k);
if (item3->text(0) == m_item[2])
{
lNum = item3->childCount();
for (int l = 0; l < lNum; l++)
{
item4 = item1->child(j)->child(k)->child(l);
if (item4->text(0) == m_item[3])
{
m_ui->treeWidget->setCurrentItem(item4);
}
}
}
}
}
}
}
}
}