[Qt]常用实用Qt小模块(经典)
猫哥
发布于 2016-03-16
0:website
http://quitcoding.com/
1:QRegExp 正则表达式
QRegExp regExp("[a-zA-Z][1-9][0-9]{0,2}");
xxx->setValidator(new QRegExpValidator(regExp,this));
lineEdit->setValidator(new QRegExpValidator(regExp,this));
2:QObject::connect()
connect(objectA,SIGNAL(methodA()),objectB,SLOT(methodB()));
//methodA()的输入参数可以比methodB()的参数多
3:QLineEdit 行文字输入widget
lineEdit->hasAcceptableInput(); //返回true or false
lineEdit->setText("please input text");
button->setEnabled(true); //set true or false
4:信号函数的定义和发射
class A {
Q_OBJECT
signals:
void funs(type A,type B); //定义信号函数
};
type a;type b;
emit funs(a,b);
//发射上面定义的信号函数 ,当然需要使用QObjetc::connect()这个函数 把这个信号函数与真实的slot函数绑定起来,slot函数才是真正干活的函数
5:Qt中可以动态调整窗口大小的Widget有哪些
QTabWidget
QListWidget 和 QStackedWidget 配合使用
QTreeWidget 和 QStackedWidget 配合使用
6:对一个继承QDialog的类,能动态改变窗口大小的方法如下:
//隐藏必要的子Widget
xx->hide();
yy->hide();
//下面这个方法非常关键,会根据xx,yy子widget是否显示,动态调整窗口的大小
layout()->setSizeConstraint(QLayout::SetFixedSize);
7:创建一个Qt风格的子类
class MyClass: pulbic QObject
{
public:
MyClass(const string& text,QObject *parent=0);
};
MyClass::MyClass(const string& text,QObject *parent): QObject(parent)
{
//构造函数的定义
}
8:QList的使用例子
QList<QString> list;
list<<"foo"<<"bar"<<"baz";
foreach(QString a,list)
qDebug()<<a;
#相当好用的QList
QList<QString> list;
list << "first";
list.append( "second" );
list.prepend( "third" );
list.insert( 1, "fourth" );
list.insert( 4, "fifth" );
9:Qt迭代器的用法
QList<int> list;
list << 23 << 27 << 52 << 52;
QListIterator<int> javaIter( list );
while( javaIter.hasNext() )
qDebug() << javaIter.next();
QList<int>::const_iterator stlIter;
for( stlIter = list.begin(); stlIter != list.end(); ++stlIter )
qDebug() << (*stlIter);
10:使用迭代器修改list的元素
QList<int> list;
list << 27 << 33 << 61 << 62;
QMutableListIterator<int> javaIter( list );
while( javaIter.hasNext() )
{
int value = javaIter.next() + 1;
javaIter.setValue( value );
qDebug() << value;
}
QList<int>::Iterator stlIter;
for( stlIter = list.begin(); stlIter != list.end(); ++stlIter )
{
(*stlIter) = (*stlIter)*2;
qDebug() << (*stlIter);
}
11:所有widget的分类
button:
QPushButton
QToolButton
QRadioButton
box:
QCheckBox
QGroupBox
QToolBox
QSpinBox
QDoubleSpinBox
QComboBox
edit:
QLineEdit
QTextEdit
QDateEdit
QTimeEdit
QDateTimeEdit
widget:
QTabWidget
view:
QListView
QTreeView
QTableView
dialog:
QInputDialog
QProgressDialog
QColorDialog
QFontDialog
QPageSetupDialog
QFileDialog
QPrintDialog
others:
QFrame QLabel QLCDNumber QProgressBar
QTextBrowser QSlider QDial
QMessageBox QErrorMessage
12:在主窗口程序中打开新的dialog对话框的方式
#1 阻塞式:(主窗口的内容是无法访问的)
QDialog dialog;
Ui_Dialog a;
a.setupUi(&dialog);
if(dialog.exec()) // 当点下ok button时会返回accept=true,当点下cancel时会返回reject=0
{
}
#2 非阻塞式:(访问子dialog的同时,也能访问父窗口)
findDialog=new FindDialog(this);
connect() //把finddialog的信息 传递给接受信息,处理信息的槽函数
findDialog->show();
findDialog->raise();
findDialog->activateWindow();
13:关于QTableWidget的使用
QTableWidget * spreadsheet=new QTableWidget(this);
setCentralWidget(spreadsheet);//这个方法是QMainWindow的方法
#得到当前鼠标focus的单元格的行坐标和列坐标
spreadSheet->currentRow()
spreadSheet->currentColumn()
#得到当前单元格的内容
//如果当前单元格内没有内容,if内容为NULL
if(spreadSheet->currentItem())
{
cout<<spreadSheet->currentItem()->text()<<endl;
}
#鼠标focus的单元格位置发生变化时,触发如下信号函数
currentCellChanged(int,int ,int,int)
14:主窗口widget常用的方法
setWindowTitle();
setWindowIcon(QIcon("xx.png"));
#在QMainWindow中如何添加菜单栏和工具栏
#创建需要 action
newAction=new QAction("&new",this);
newAction.setIcon(QIcon("xx.png"));
connect(newAction,SIGNAL(),object,SLOT()); //让action干相应的活
#添加一个菜单栏
QMenu *fileMenu=menuBar()->addMenu("&File");
fileMenu->addAction(neAction);
fileMenu->addSeparator();
#添加一个QToolBar
QToolBar * fileToolBar= addToolBar("&file");
fileToolBar->addAction(newAction);
fileToolBar->addSeparator();
//menufile->addSeparator()这个函数也是返回一个QAction *类型的数据
#在statusBar()中添加widget
statusBar()->addWidget(label);
statusBar()->addWidget(label,1); //从左开始放label,1表示用空白扩展剩下的右边空间
statusBar()->showMessage(const QString & str);
15:QLabel的所有设置
QLabel * label=new QLabel("w999");
label->setAlignment(Qt::AlignHCenter);//文字对齐方式
label->setMinimumSize(label-sizeHint());//文字宽度最少4个字符,当QLabel中没有字符时,也会保证最少有4个字符的空白位置显示
16:QSettings的用法
#创建settings对象
QSettings settings("Yzs_think", "Application");
公司或组织名称:Yzs_think, 程序名称:Application
#从settings中读出数据,设置应用程序的相关参数,可以设置默认值
QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
QSize size = settings.value("size", QSize(400, 400)).toSize();
resize(size);
move(pos);
#程序退出前,把需要保存的参数保存到settings中,书上说是保存到注册表中去了,还没有实践过
QSettings settings("Yzs_think", "Application");
settings.setValue("pos", pos());
settings.setValue("size", size());
17:窗口重要属性设置
#保证容器一直在top layer(就是常用的fix 窗口在顶层)
w.setWindowFlags(Qt::WindowStaysOnTopHint);
18:各类event函数调用的条件
//event函数被调用,分为下面几种情况:
1:用户对mouse and keyboard的操作
2:定时器时间到了
3:网络超时
4:窗口管理器
1:上面是4类称为event sources,事件产生的源头
2:event object:这个就是包含事件源有何种改变的事件对象( 如QPressedEvent *e)
3:event target,这处就是事件会通知给谁(一般就是事件处理函数)
一句话说:event sources发生的事件变化,包装到event object中,传递给event target
//窗口大小发生变化时,或是鼠标从一个widget到另一个widget时移动时, 程序启动时会在构造函数调用调用之后,调用 paintEvent函数(参数类型不能写错)
void paintEvent(QPaintEvent *)
//点了右上角的x时,会调用该方法
void closeEvent(QCloseEvent *)
19:关于Qt中的主窗口
qt中的主窗口是是没有父窗口的
有父窗口的widget,称为子部件
Qt::WindowFlags作为父窗口的第二个参数,可以定义父窗口很多重要属性:如下
Qt::Widget
Qt::Dialog
Qt::SplashScreen
#保证容器一直在top layer(就是常用的fix 窗口在顶层)
w.setWindowFlags(Qt::WindowStaysOnTopHint);
#函数对窗口进行最大,最小化,全屏操作
setWindowState()
#对于主窗口,我们非常关心窗口的大小和出现的位置,下面的函数是getter,
主窗口包含两部分:
1:框架部分(如title and border):使用x(),y(),pos(),move(),frameGeometry()函数访问
2:内容部分,称为无框架的窗口:使用width(),height(),geometry(),setGeometry(),Rect(),Size()函数访问 ,resize()函数是调整内容部分的大小。
综上:使用move(),setGeometry()两个函数设置窗口出现在桌面的位置和窗口的长宽。
w.setGeometry(QRect(0,0,400,400));//这里的0,0,是.geometry().x() .y()的值设置为0
w.move(0,0);//这里的0,0是pos().x() .y()的值设置为0
#setFixedSize(size.Hint())//固定主窗口的大小为不可改变
通常如下,设置父窗口的大小位置
w.setGeometry(QRect(0,0,400,400));
w.move(0,0);
#w.frameGeometry() 这个是外边框的信息 .x() .y() .width() .height()
#w.geometry() 是内部内容部分的信息 .x() .y() .width() .height()
.resize(w,h)函数 调整大小,是内容部分的宽高
19:Qt creator中,断点调试方法
在程序代码行号前单击,确定断点,再点击,取消断点
按F5,程序进入断点调试过程,比较慢,不是大的问题,不需要用这样的方法调试,太耗费资源时间了
断点的好处就是方便的观察变量的值
20:从下面的图可以看到frameGeometry是外边框,geometry是内容窗口(内容窗口包含在外加框里面,所以尺寸更小)
21:父窗口与子widget
指明了父窗口的子widget,可以不用显式的delete掉,父窗口会处理好后面的垃圾回收工作
模态窗口与模态窗口(根据需要进行选择show() or exec())
另一种实现modal态的方法:(阻塞态)
(这种方法可以使窗口为阻塞态的同时,程序还可以处理其它的事情,因为调用 了show()之后,控制权就给调用者了)
QDialog *d=new QDialog(this);
d->setModal(true);
d->show();
setWindowModality(xx)://xx可取下三值 :
Qt::NonModal :不阻塞
Qt::WindowModal :阻塞父,祖窗口,和他们的子窗口
Qt::ApplicationModal :阻塞所有窗口,setModal(true)就是达到这一效果
22:信号和槽
signal and slot的作用是完成对象之间协同工作,如信息的传递,事件的响应
close() 槽一般是隐藏窗口,只有当 当前widget是最后一个窗口时,才会delete掉
Closes this widget. Returns true if the widget was closed; otherwise returns false.
First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.
If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.
The QApplication::lastWindowClosed() signal is emitted when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed. By default this attribute is set for all widgets except transient windows such as splash screens, tool windows, and popup menus.
23:Qt自带的不同dialog的使用
#1: 颜色对话框
QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);//可以设置颜色的alpha值
#2: 颜色对话框
QColorDialog dialog(Qt::red,this);
dialog.setOption(QColorDialog::ShowAlphaChannel);
dialog.exec();
QCoolor color=dialog.currentColor();
#3: 文件对话框 返回的是包含绝对路径的文件名
QString fileName=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*.png *.jpg)"));
#4:文件对话框 返回多个文件名
QStringList fileNames=QFileDialog::getOpenFileNames(this,tr("文件对话框"),"D:",tr("图片文件(*.png *.jpg)"));
#5: 文件对话框(保存文件,另存)
QFileDialog::getSaveFileName();
#6: 得到已存在文件夹的路径
QFileDialog::getExistingDirectory();
#7:得到字体对话框(设置对象字体时需要)
bool ok;
QFont font=QFontDialog::getFont(&ok,this)
if(ok)
{ //yes u select a font
xx->setFont(font);![图片描述][1]
}
else
{
}
#8:得到用户输入对话框:QInputDialog
QInputDialog::getText(xx);
QInputDialog::getInt(xx);
QInputDialog::getDouble(xx);
QInputDialog::getItem(xx);
#9信息对话框 :QMessageBox
QMessageBox::information();
QMessageBox::quesiton();
QMessageBox::warning();
QMessageBox::critical();
QMessageBox::about();
24:QProgressBar(经常需要用到的)
25:QWizard 用来实现软件的使用介绍指南是非常不错的(引导用户学习软件的使用方法)
QWizardPage * createPage()
{
QWizardPage * page=new QWizardPage;
page.setTitle("开始学习");
return page;
}
QWizard *wizard=new QWizard(this);
wizard->setWindowTitle("软件使用指南");
wizard->addPage(createPage());
wizard->exec();
delete wizard;
26 与打印有关的几个对话框
QPageSetupDialog --- QPrintDialog --- QPrintPreviewDialog
27 QMainWindow
28 Qt实用小功能
#QString
QString a="hello";
QString b="world";
QString c=a+" "+b;
c.append(" ok");
c.prepend("head ");
QString::number(string.size());
string.toUpper();
string.toLower();
#目前使用Qt的版本
qVersion();//return char *
#Qt的标准输出流
QTextStream out(stdout);
out << "console application\n";
#Qt文件的写入
QFile data("filename");
if (data.open(QFile::WriteOnly)) {
QTextStream out(&data);
out << "You make me want to be a better man." << endl;
}
#Qt文件的读出
QFile data("filename");
QString line;
if (data.open(QFile::ReadOnly)) {
QTextStream in(&data);
in.setCodec("UTF-8"); //设置utf文件编码
do {
line=in.readLine();
}while(!line.isEmpty());
}
#QList
QTextStream out(stdout);
QList<QString> list;
list << "Balzac" << "Tolstoy" << "Guldbrassen"
<< "London" << "Galsworthy" << "Sienkiewicz";
qSort(list);
for (int i = 0; i < list.size(); ++i) {
out << list.at(i) << endl;
}
#QDir
QTextStream out(stdout);
QString home = QDir::homePath();
out << home << endl;
#得到某一目录下的特定类型文件名
QTextStream out(stdout);
QDir dir;
QStringList filters;
filters << "*.c" << "*.c~"; //对不需要的文件进行过虑
dir.setNameFilters(filters);
QFileInfoList list = dir.entryInfoList();
for (int i=0; i<list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
out << QString("%1").arg(fileInfo.fileName()); /文件名在这里
out << endl;
}
#QTime
QTime qtime = QTime::currentTime();
QString stime = qtime.toString(Qt::LocalDate);
29:Qt的QBoxLayout and QGridLayout
QHBoxLayout * hlayout =new QHBoxLayout();
hlayout->addWidget(QWidget *, int stretch=0,Qt::Alignment alignment=0);
QGridLayout * glayout =new QGridLayout();
glayout->addWidget(QWidget *,int row, int col,int rowspan=1,int colspan=1,Qt::Alignment alignment=0);
QFormLayout
QStackedLayout
30:关于QWidget的sizeHint
sizeHint();
minimumSizeHint();
对于每个widget,都有这两个函数,用来保存部件的建议大小尺寸和最小大小尺寸
当我们使用了下面的函数,设置了最小大小后,就不会用minimumSizeHint的大小了
pushButton->setMinimumSize();
setSizePoliy()这个函数对于设置widget的尺寸大小非常重要
下面的函数用来 读取 和 设置 widget的sizePolicy属性
pushButton->sizePolicy();
pushButton->setSizePolicy(QSizePolicy::Policy horizontal QSizePolicy::Poliyc vertical );
QSizePolicy的取值有:
QSizePolicy::Minimum :sizeHint提供的值是最小的尺寸
QSizePolicy::Maximum :sizeHint提供的值是最大的尺寸
QSizePolicy::Fixed :只能使用sizeHint的值,也可使用setFixedSize函数定死widget的大小
QSizePolicy::Expanding :最合适的大小为sizeHint,但是可压缩,不过倾向于expanding
QSizePolicy::Preferred :最合适的大小为sizeHint,可升可缩
QSizePolicy::MinimumExpanding :sizeHint提供的值是最小的尺寸,倾向于expanding
QSizePolicy::Ignored ;不考虑sizeHint的值,有多大变多大
#使用例子
QSizePolicy policy ;
policy.setHorizontalStretch(1);
policy.setVerticalStretch(1);
policy.setHorizontalPolicy(QSizePolicy::Minimum);
button->setSizePolicy(policy);
pushButton3->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);
31:Qt中文件名的解析例子
QString filename="/abc/9.jpg";
QFileInfo qfile(filename);
qcout<<qfile.baseName()<<endl; // 9
qcout<<qfile.absoluteFilePath()<<endl; // /abc/9.jpg
qcout<<qfile.absoluteDir().absolutePath()<<endl; /abc
qcout<<qfile.completeSuffix()<<endl; //jpg
qcout<<qfile.fileName()<<endl; //9.jpg
#实用小例子:
QString filename="/root/abc/10.jpg";
QFileInfo qfile(filename);
QString extension=qfile.completeSuffix(); //得到后缀jpg
QString absoluteFnNoExtension=QString(filename).remove("."+extension);// 去除后缀 /root/abc/10
QString alphaname=absoluteFnNoExtension+"_alpha."+extension; //产生其它需要的文件名
32:Qt中QString 到char *pt的转化
QString one="11.jpg";
QString two="22.jpg";
QString three="33.ddd";
//这一步是必需要的,没有这个中间过程会产生问题
string cone=one.toStdString();
string ctwo=two.toStdString();
string cthree=three.toStdString();
const char *pone=cone.c_str();
const char *ptwo=ctwo.c_str();
const char *pthree=cthree.c_str();
33:Qt中得到格式化后人DateTime
##日期时间格式化字符串,也是比较容易的(要懂英语哦)
###以显示年为例,通常我们的年份都是4个数字,year是年的单词
###那么用yyyy就表示年的占位符
###有个问题:月month的占位符和分钟minute的占位符都是mm??怎么办
###解决办法是月的占位符用M,分钟的占位符用mm
###理解了上面的原则后,就不需要死记硬背了哦
QDateTime nowDateTime=QDateTime::currentDateTime();
//QString nowDateTimeStr=nowDateTime.toString("yyyy-M-dd hh:mm:ss");
QString nowDateTimeStr=nowDateTime.toString("yyyy/M/dd hh:mm:ss");
ui->dateTimeLabel->setText(nowDateTimeStr);
33:QSignalMapper的使用方法
QSignalMapper * mapper=new QSignalMapper(this);
mapper->setMapping(button0,"0");
mapper->setMapping(button1,"1");
...
connect(button0,SIGNAL(clicked()),mapper,SLOT(map()));
connect(button1,SIGNAL(clicked()),mapper,SLOT(map()));
connect(mapper,SIGNAL(mapped(QString)),this,SLOT(buttonClicked(QString)));
#工作方法:
#当button0发生clicked()信号后,会调用map()槽
#map()曹函数会根据setMapping里面设置的QString,发送一个mapped(QString)信号
#然后这样就会调用 buttonClicked(QString)这个槽函数,根据QString的数据,
#就可以知道用户点击了哪个按键!
#当有很多button,并且希望在一个槽函数中,处理所有clicked事件时,可以使用
#QSignlaMapper实现
34:Qt中不需要原生的最大最小化框架,设置主窗口背景的颜色和透明程度方法(高级)
#Qt中经常需要隐藏原生的最大最大小化按钮,然后定制自己的最大,最小化方式,下面是常用的方法
#在构造函数中使用如下函数
setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); //无原生框架,最前端显示
setAttribute(Qt::WA_TranslucentBackground, true); //如果需要主窗口背景透明,调用这个函数
#如果需要设置主窗口的背景颜色和透明的程度,可以在paintEvent函数中调用如下函数 :
QPainter painter(this);
painter.fillRect(this->rect(), QColor(255, 255, 255, 0)); //前三个数值为颜色,最后一个值为alpha通道,即是透明程度(0全为背景全透明,即看到不背景)
#注意,看调用 setAttribute(Qt::WA_TranslucentBackground, true);函数后,背景默认是全透明的!
34:设置主窗口或QFrame的边框为圆角的方法(可能有更简单的方法)
#paintEvent事件处理函数中,使用如下方式实现
QBitmap bmp(ui->frame->size());
bmp.fill();
QPainter p(&bmp);
p.setBrush(Qt::black);
p.setRenderHint(QPainter::Antialiasing); //抗锯齿
p.drawRoundedRect(bmp.rect(), 5, 5); //四个角都是圆弧
//只要上边角圆弧
int arcR = 5; //弧度
QRect rect = this->rect();
// QPainterPath path;
// //逆时针
// path.moveTo(arcR, 0);
// path.arcTo(0, 0, arcR * 2, arcR * 2, 90.0f, 90.0f);
// path.lineTo(0, rect.height());
// path.lineTo(rect.width(), rect.height());
// path.lineTo(rect.width(), arcR);
// path.arcTo(rect.width() - arcR * 2, 0, arcR * 2, arcR * 2, 0.0f, 90.0f);
// path.lineTo(arcR, 0);
// p.drawPath(path);
// p.fillPath(path, QBrush(Qt::Red)); //arm和windows平台没有这行代码将显示一个透明的空空的框
ui->frame->setMask(bmp);
35:使用QSS管理全局样式的方法
#对于一个不大的项目,一到两个人维护时,把所有Widgets的样式放到一个qss文件中,是理想的选择
#设置方法如果,在Qt designer中preview样式后(alt+shift+R)后,就可以把样式复制qss文件中了
QApplication a(argc, argv);
setStyle(":/style/qss.qss");
#补一个实用的qss,button默认的边框和白色背景不显示的方法,
ui->closeButton->setStyleSheet("border-style:hidden;");