本人觉得这篇文章超级棒,简直就是神文章
10. ui中的close函数只是关闭窗口的显示功能而已,并没有delete掉里面的变量。
11. QPalette为调色版,其颜色组分为3组,活动组,非活动组,
12. 可用组;其中活动组为当前窗口所在组,非活动组为其它窗口所在组,不可用组是由于某种原因暂时不能使用的组 。改变调色版的颜色可以使用setColor这个函数,这个函数有2个重载函数,其中参数ColorRole表示是更改哪个参数;比如说一般的背景色。
13. EditLine背景色颜色角色为QPalette::Base;前景色文字的颜色角色为QPalette::Text.
14. Button背景色颜色角色为QPalette::Button.前景色文字的颜色角色为QPalette::ButtonText.
15. Label前景文字颜色角色为QPalette::WindowText.
16. 当在TextBrowser中进行图片显示时,如果需要让显示图片的窗口自适应图片的大小,可采用QTextBrowser下的setFixedWidth()和setFixedHeight()函数来设置窗口尺寸,其参数是从图片中获取。当然这个设置的窗口长和宽已经包括了右边和下边的滚动条,所以给参数的时候需要把这2者考虑进去。
17. 要对整个窗口的背景该色,且不改变其上面控件的背景色,则这时需用QPalette类。且时需用Window作为背景色角色;如果用Base作为背景色角色的话,那么它只会改变QTextEidt类及其派生类的背景色;如果用seStyleSheet,其用background-color的话,那么它会把其上面的控件背景色全改了,且相应的子窗口的也都改了。
18. 在Qt中,将1个数值a转换成文本,可采用,tr(“%1”).arg(a).也可采用QString::number(a).
19. 实际运行到这几句代码时,并不是显示完first,延时1s后显示second,再延时1s后显示third. 而是直接延时2秒,first,second,third同时显示呢?
20. 其原因在主线程GUI中不宜采用sleep()等函数,否则会出现意想不到的结果。
21. 如果需要延时,#include
22. QtCreator中使用的是MinGW进行编译的,所以在windows下如果想要下载QtCreator就需要下载对应mingw的版本,而不是vs的,否则是编译不了的。或者自己下载Qt源码库,用Cmake中选中MinGW重新编译即可。
23. 所以如果安装Qt libraries 4.8.2 for Windows (minGW 4.4, 318 MB),则必须先安装QtCreator,因为QtCreator安装过程中会自动安装MinGW,而Qt libraries 4.8.2 for Windows (minGW 4.4, 318 MB)的安装又必须使用MinGW。因此这2者的顺序不可颠倒。
24. 但是自从QtCreator2.5.0以后,就不再捆绑MinGW了,需要用户自行下载安装。Qt官网给出的下载地址为ftp://ftp.qt.nokia.com/misc/MinGW-gcc440_1.zip.
25. 当然我们也可以用VS的编译器进行编译,这样装了微软的VS后我们在QtCreator中设置好微软的编译器目录,然后在QtCreator中进行编写代码,编译调试等.
26. 在用微软的调试器时可以装一个dbg_x86_6.11.1.404.msi,装完后QtCreator会自动识别这个dbg调试器的.
27. Qt中用来显示图片的控件为Label后者用TextBrowser.当用Label显示时,需要用setPixmap函数,且该函数对应传入与图像相关的参数为图像的数据部分;当用TextBrowser显示时,直接用append函数即可。该函数对应传入与图像相关的参数为图像的文件名(要包含路径)。
28. 显示文本的控件为TextBrowser.
29. 获得spinBox的值是调用其value()函数。
30. 获得LineEdit的值是调用其text()函数,然后转换成相应的数据类型即可。
31. ui中的close函数只是关闭窗口的显示功能而已,并没有delete掉里面的变量。
32. QPalette为调色版,其颜色组分为3组,活动组,非活动组,
33. 可用组;其中活动组为当前窗口所在组,非活动组为其它窗口所在组,不可用组是由于某种原因暂时不能使用的组 。改变调色版的颜色可以使用setColor这个函数,这个函数有2个重载函数,其中参数ColorRole表示是更改哪个参数;比如说一般的背景色。
34. EditLine背景色颜色角色为QPalette::Base;前景色文字的颜色角色为QPalette::Text.
35. Button背景色颜色角色为QPalette::Button.前景色文字的颜色角色为QPalette::ButtonText.
36. Label前景文字颜色角色为QPalette::WindowText.
37. 当在TextBrowser中进行图片显示时,如果需要让显示图片的窗口自适应图片的大小,可采用QTextBrowser下的setFixedWidth()和setFixedHeight()函数来设置窗口尺寸,其参数是从图片中获取。当然这个设置的窗口长和宽已经包括了右边和下边的滚动条,所以给参数的时候需要把这2者考虑进去。
38. 要对整个窗口的背景该色,且不改变其上面控件的背景色,则这时需用QPalette类。且时需用Window作为背景色角色;如果用Base作为背景色角色的话,那么它只会改变QTextEidt类及其派生类的背景色;如果用seStyleSheet,其用background-color的话,那么它会把其上面的控件背景色全改了,且相应的子窗口的也都改了。
39. 在Qt中,将1个数值a转换成文本,可采用,tr(“%1”).arg(a).也可采用QString::number(a).
40. Qtimer::singleShot(0, this, SLOT(event()));
41. 其中第一个参数为时隔多长(单位为ms)执行后面的event信号函数,当然该函数的函数名可以自己定义。这句代码的意思是立即执行执行event()函数。和sleep()函数一样,在Qt中也不能用opencv中的waitKey()函数来进行延时。
42. 用QT Creater编程,如果没有自动补全是很痛苦的事情,于是便查阅了QT的文档,发现CTRL+SPACE是自动补全的快捷键;
但是在 Creater里使用居然没有效果,估计是输入法切换的冲突(CTRL+SPACE是我中英文输入的默认快捷键)
于是寻求解决方法,在QT Creater->Tools->Options... 里找到environment->Keyboard,发现TextEditor.CompleteThis命令,其快捷键是Ctrl+Space;将其result掉,然后输入Alt+/(Eclipse里习惯的~~)后应用退出即可.
43. 要达到像vs一样在终端(单独的终端)输出想调试的各种信息,不是采用cout,而是采用qDebug()<<”xxx”;
44. 如果菜单下的action不能够运动到toolbar上,则在toolbar上右击,选择separate toolbar,然后移动即可。
45. setCentralWidget()函数是把控件布满整个界面的语句。
46. 在Qt程序其中的一个函数中,如果需要调用另一个窗口类且显示出来,则有2种方法。其一是在本类中定义一个全局变量,然后在这个函数中new一个对象。如下所示:
void MainWindow::on_actionNew_Window_triggered()
{
my_dailog = new Dialog(this);
my_dailog->show();
}
这种情况下建立的窗口时非模态的,且可以同时调出多个my_dialog窗口来。
另外一种方法是在程序内部定义一个类对象,如下所示:
void MainWindow::on_actionNew_Window_triggered()
{
Dialog my_dialog;
my_dialog.setModal(false);
my_dialog.exec();
}
但是不管其模态设置是否为true,该窗口都是模态的,即该窗口显示出来时其它的窗口不能工作了。当然此时只能显示1个my_dialog了。
47. Qt中的label控件对应android中的是TextView控件。
48. 如果想要窗口内部的控件大小随着窗口拉伸等变化而变化,则需要在布局中设置,点击ui文件中的主体,然后选择布局控件中满足自己需求的一个即可。
49. window下的路径名需要用2个左斜杠或者1个右斜杆。即”/”或者””。
50. 在界面中设置显示的文字属性,如果在cpp中被重新设置了,那么运行时是以cpp中设置的最后的设置,因为这些属性被覆盖掉了.
51. 在Qt Designer界面设计中,label中显示的内容各种属性都可以设置,比如字体格式,颜色等.但是PushButton中显示的字体在属性栏就只能更改其内容。如果要更改其它属性则需要在代码中实现。
52. 一般信号中的toggled是指对应的属性为checkable,然后被鼠标单击了下而发射的。这个在复选按钮和单选按钮中比较常见,但是在PushButton中也是可以用的,将PushButton的属性checkable设置为真,则运行时鼠标单击一下,按钮的颜色会变淡,再单击一下又会变亮,它是以颜色的的深浅来提醒它的toggle的。
菜单栏中的一个选项,一般是用trigger来发射信号。
53. Qt的MessageBox中比较常用的是,MessageBox::warning(),MessageBox::information,MessageBox:YES等。
54. 在LineEdit中有一个echoMode,里面可以选中password模式,则在LineEdit中输入的内容对用户是不可见的,当然对系统是可见的,我们可以将其内容读取出来。
55. Cmobo Box中增加一项用的是addItem()函数。例如:
ui->comboBox->addItem("China");
56. Qt中QListView是基于Model的,QListWidget是基于Item的。
57. 如果是用QListWidget的话,加入内容采用的是addItem()方法。
58. 头文件和对应的源文件可以同时include同一个头文件。
59. 用滑动条触发进度条的实验中,至少有下面3种方法可以执行。
可以直接在界面设计的信号与槽中连接好对应的信号与槽。无需任何代码。
在界面的构造函数中用connect函数连接好信号与槽,也无需其他代码。如下:
connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), ui->progressBar, SLOT(setValue(int)));
可以在滑动条值改变的槽函数中实现,如下:
void Dialog::on_horizontalSlider_valueChanged(int value)
{
ui->progressBar->setValue(ui->horizontalSlider->value());
}
60. 让状态栏显示文本不是采用setText()方法,而是采用showMessage().其第二个参数为显示该内容持续的时间,以毫秒为单位。
61. 如果在Qt Creator中需要带参数运行,因为在main函数中经常有argv这个变量传入参数,这可以在Qt Creator的左侧Project一栏中—>Targets—>Desttop(中间偏上的位置)—>Run —>Arguments中输入需要附加的参数即可。
62. QtextEdit除了用append()函数显示图片外,还可以用insertHtml()函数和setPlainText()来显示,用法类似,其中insertHtml()可以用来显示图片和有格式的文字,而setPlainText()只能用来显示无格式的文字。
63. Qt Gui界面的显示是在程序的构造函数执行完后完成的,所以如果在构造函数中对界面有动态的输出效果我们是看不到的,只能都构造函数执行完了后才能看到最后的结果。那么怎么办才能做到在构造函数结束时自动调用某一程序来完成我们想要看到的动态初始化效果呢?这里可以使用QTimer下的singleShot()函数。
64. Qtimer::singleShot(0, this, SLOT(event()));
65. 其中第一个参数为时隔多长(单位为ms)执行后面的event信号函数,当然该函数的函数名可以自己定义。这句代码的意思是立即执行执行event()函数。
和sleep()函数一样,在Qt中也不能用opencv中的waitKey()函数来进行延时。
66. 用QT Creater编程,如果没有自动补全是很痛苦的事情,于是便查阅了QT的文档,发现CTRL+SPACE是自动补全的快捷键;
但是在 Creater里使用居然没有效果,估计是输入法切换的冲突(CTRL+SPACE是我中英文输入的默认快捷键)
于是寻求解决方法,在QT Creater->Tools->Options... 里找到environment->Keyboard,发现TextEditor.CompleteThis命令,其快捷键是Ctrl+Space;将其result掉,然后输入Alt+/(Eclipse里习惯的~~)后应用退出即可.
67. 要达到像vs一样在终端(单独的终端)输出想调试的各种信息,不是采用cout,而是采用qDebug()<<”xxx”;
68. 如果菜单下的action不能够运动到toolbar上,则在toolbar上右击,选择separate toolbar,然后移动即可。
69. setCentralWidget()函数是把控件布满整个界面的语句。
70. 在Qt程序其中的一个函数中,如果需要调用另一个窗口类且显示出来,则有2种方法。其一是在本类中定义一个全局变量,然后在这个函数中new一个对象。如下所示:
void MainWindow::on_actionNew_Window_triggered()
{
my_dailog = new Dialog(this);
my_dailog->show();
}
这种情况下建立的窗口时非模态的,且可以同时调出多个my_dialog窗口来。
另外一种方法是在程序内部定义一个类对象,如下所示:
void MainWindow::on_actionNew_Window_triggered()
{
Dialog my_dialog;
my_dialog.setModal(false);
my_dialog.exec();
}
但是不管其模态设置是否为true,该窗口都是模态的,即该窗口显示出来时其它的窗口不能工作了。当然此时只能显示1个my_dialog了。
Qt中的label控件对应android中的是TextView控件。
71. 如果想要窗口内部的控件大小随着窗口拉伸等变化而变化,则需要在布局中设置,点击ui文件中的主体,然后选择布局控件中满足自己需求的一个即可。
72. window下的路径名需要用2个左斜杠或者1个右斜杆。即”/”或者””。
73. 在界面中设置显示的文字属性,如果在cpp中被重新设置了,那么运行时是以cpp中设置的最后的设置,因为这些属性被覆盖掉了.
74. 在Qt Designer界面设计中,label中显示的内容各种属性都可以设置,比如字体格式,颜色等.但是PushButton中显示的字体在属性栏就只能更改其内容。如果要更改其它属性则需要在代码中实现。
75. 一般信号中的toggled是指对应的属性为checkable,然后被鼠标单击了下而发射的。这个在复选按钮和单选按钮中比较常见,但是在PushButton中也是可以用的,将PushButton的属性checkable设置为真,则运行时鼠标单击一下,按钮的颜色会变淡,再单击一下又会变亮,它是以颜色的的深浅来提醒它的toggle的。
菜单栏中的一个选项,一般是用trigger来发射信号。
76. Qt的MessageBox中比较常用的是,MessageBox::warning(),MessageBox::information,MessageBox:YES等。
77. 在LineEdit中有一个echoMode,里面可以选中password模式,则在LineEdit中输入的内容对用户是不可见的,当然对系统是可见的,我们可以将其内容读取出来。
78. Cmobo Box中增加一项用的是addItem()函数。例如:
ui->comboBox->addItem("China");
79. Qt中QListView是基于Model的,QListWidget是基于Item的。
80. 如果是用QListWidget的话,加入内容采用的是addItem()方法。
81. 头文件和对应的源文件可以同时include同一个头文件。
82. 用滑动条触发进度条的实验中,至少有下面3种方法可以执行。
可以直接在界面设计的信号与槽中连接好对应的信号与槽。无需任何代码。
在界面的构造函数中用connect函数连接好信号与槽,也无需其他代码。如下:
connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), ui->progressBar, SLOT(setValue(int)));
可以在滑动条值改变的槽函数中实现,如下:
void Dialog::on_horizontalSlider_valueChanged(int value)
{
ui->progressBar->setValue(ui->horizontalSlider->value());
}
83. 让状态栏显示文本不是采用setText()方法,而是采用showMessage().其第二个参数为显示该内容持续的时间,以毫秒为单位。
84. 如果在Qt Creator中需要带参数运行,因为在main函数中经常有argv这个变量传入参数,这可以在Qt Creator的左侧Project一栏中—>Targets—>Desttop(中间偏上的位置)—>Run—>Arguments中输入需要附加的参数即可。
85. Windows+Qt Creator+Opencv的使用:
需要在Qt工程中,即***.pro文件中加入:
INCLUDEPATH+=C:\Qt\opencv2.4.2\build\include\
C:\Qt\opencv2.4.2\build\include\opencv\
C:\Qt\opencv2.4.2\build\include\opencv2
LIBS+=C:\Qt\opencv2.4.2\build\x86\vc10\lib\opencv_core242d.lib\
C:\Qt\opencv2.4.2\build\x86\vc10\lib\opencv_highgui242d.lib\
C:\Qt\opencv2.4.2\build\x86\vc10\lib\opencv_imgproc242d.lib 特别要注意的地方是INCLUDEPATH后面添加的是C:\Qt\opencv2.4.2\build\include\等,而不是C:\Qt\opencv2.4.2\include\等,否则一直报错。 另外还有一点是Qt中的目录不能包含空格,所以安装的opencv目录前如果有Program Files是不行的,为此我还专门把opencv移到了另一个目录,2个opencv同时用。 86. QTextBrowser中append方法是在当前框下一行加入内容,可以是文字或图片等。它本身已经固定了换行模式,取消不了。
setText方法是在框在加入内容,也可以是文字或图片等,但是它会把前面所有的内容都覆盖掉。
insertHtml和append一样,可以加入文本或图片等,它不会覆盖掉其内容,但是默认的也是从下一行开始的,即有换行模式,不过该自动换行模式可以被取消。采用下面的语句:
ui->textBrowser->setWordWrapMode (QTextOption::NoWrap);
同理,如果要恢复自动换行模式,采用:
ui->textBrowser->setWordWrapMode (QTextOption::WordWrap);
87. 解决新版Qt中不能使用opengl中的gluXXX()函数方法:
1. 先下载glut库http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip。
2.将下载下来的文件解压,将glut32.lib和glut.lib两个lib文件移到qt目录下的./lib文件夹中。
3.将glut.dll和glut32.dll两个动态链接库移到C:\windows\system32中。
4.将glut.h文件移到qt目录下的\include\QtOpenGL中
5.新建一个txt文件,里面输入代码:#include “glut.h”,然后把该txt文件的名字重命名为glut,注意这个地方不需要加后缀
6. 切换到在自己的程序中,在myGLWidget.cpp(QGLWidget派生类的cpp)加入"#include
上面的"#include
88. 在Qt中使用定时器的方法:
法一:只需启动定时器,例如startTimer(5);这里是设置5ms定时,然后复写timerEvent(QTimerEvent*)函数即可。
法二:用如下代码进行设置
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerEvent()));
timer->start(5); 然后重写timerEvent()槽函数即可。 89. 当使用tr进行语言国际化时,有可能会出现错误:error : 'tr' was not declared in this scope。解决方法:在程序中加入#include,并使用QObject::tr(); 90. Qt中如果需要更改工程名的话(这里指用QtCreator建立的工程),则需删除一些QtCreator生成的与旧工程名相关的文件,一般删除如下文件:Makefile、Makefile.Debug、Makefile.Release、*.pro.user,以及目录release、debug。然后更改*.pro文件的名字,重新打开工程编译即可。 91. QFileInfo类是用来提供与系统无关的文件信息的。canonicalFilePath指的是解释过的绝对路径,比如"..","."分别解释为上一级目录和本目录。 92. qobject_cast(B),当类型B和A相同或者类型B是A的子类类型,则返回类型A。否则返回0;其实就是说如果B可以转换成A的话(2种类型有相似性),则进行强制类型转换,否则转换失败。 93. QSetting类提供了平台无关的永久保存应用程序设置的方法,这些设置包括窗口的位置,大小等信息。
94. QRectF为一个float精度的矩形框。
95. QPainter为一个绘图装置,我们可以在上面进行绘图,绘图的对象为widget或者printer。
96. 画笔是用来绘制线型的,主要样式有3个方面:笔帽,结合点和线型。
97. 画刷是用来画填充封闭的几何图形的,主要有2个参数设置:颜色和样式。
98. 如果编译时出现Qt自带的源代码处的错误提示,比如说:qtextoption.h语法错误: 缺少“;”(在标识符“QtGuiModule”的前面)
99. 定位到错误的地方时,是Qt系统的源码,按照道理系统源码时不会出错的,这时有能是自己写的一个类继承了系统提供的类,而这个类在头文件的括号中没有使用分号所致.
100. 在Qt中使用定时器功能有2中方法,第一个是使用QTimer类。第二个是使用QObject子类的重载函数timerEvent()。在使用第1种方法时需要将设置定时器的信号与槽连接,然后使用start函数来启动该定时器,使用stop方法来停止定时器。在使用第2种方法时,只需要调用系统的startTimer()函数就可以了。
101. QTimer::singleShot()方法可以完成在时间间隔完成后执行后面的槽函数,相当于个直接的延时函数,使用起来应该还是蛮方便的。
102. 颜色的第4个通道值可以理解为不透明度,即如果为255的话,就指的是完全不透明。
103. QString::number(num)可以将整型的num转换成string型。
104. qreal 其实就是double型。
105. 往QListWidget加入文字可以使用其addItem()方法.
106. arg()中的参数是QString型,则其对应的百分号需要用单引号括起来。
107. Qt::DecorationRole是Qt::ItemDataRole中的一种, Qt::ItemDataRole表示每一个model中的Item都有自己的一个数据集,且有自己的特色。这些特点用来指定模型中的哪一种数据类型将被使用。而Qt::DecorationRole指的是说数据将以图表的形式来呈现。
108. QAbstractItemView为一个抽象item视图类,里面有很多方法可以重写。
109. QPaint是一个绘图类,可以设置画笔,画刷,字体。
110. 在设计用户名密码登陆时,如果用户名和密码都正确,则会调用调用父类的QDialog::accept()槽函数,该函数实现关闭当前对话框,设置对话框的运行结果为QDialog::Accepted,并发送QDialog::finished(int result)信号。
111. 增加StackWidget页面的方法,在StackWidget上鼠标右击,选择insert page,然后继续选择在本页之前或者之后加入页码。
112. QAction对象使用setText()方法时,如果在对象的构造函数中已经有了其文字显示,那么action上面显示的就是构造函数中的text文本。这里的setText文本有2个作用,第一个是如果该action对应到了菜单栏中,则菜单栏会自动将其显示出来;第二个时如果构造函数中没有设置文本内容,则该action会显示setText()方法设置的内容,当然了,如果action设置了图标,该文本内容就被覆盖了,退化为文本提示了。
113. cellClicked(int, int)信号是当表格中的一个cell单元被单击时发出的。它的两个参数分别为表格中cell的行号和列号。
114. 可以使用frameGeometry()来获得程序中的主界面,然后该界面的定位函数可以获得与主界面的相对位置,比如说frameGeometry().bottomLeft()就是获得主界面的左下方的位置。
115. 当自己定义了的一个类,该类有对应的头文件和源文件。如果在第二个类的头文件中药使用到第一个类,则可以不用包含第一个类的头文件,直接用class关键字声明就可以了,在第二个类的源文件中则需要包含第一个类的头文件,因为这里需要使用第一个类对象的成员方法。
116. Qt中正则表达式为类QRegExp,正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。比如说程序中的QRegExp rx("\\[\\d{2}:\\d{2}\\.\\d{2}\\]");其实就是表示歌词文件前面的格式,比如[00:05.54]。表达式中的d{2}表示匹配2个数字。
117. Qt中常见的类的继承总结:
如果需要设计界面,且需要菜单栏,工具栏,状态栏等,一般继承QMainWidget类。
如果需要界面,不需要菜单栏,工具栏,状态栏等,一般继承QDialog类。
如果需要使用自定义视图来画图形,则可以继承QAbstractItem类。
如果需要自己设计场景,比如游戏开发的时候,可以继承QGraphicsView类。
如果需要自己制作一个小图形视图,可以考虑继承QGraphicsObject类,当将这些小视图构成一个视图组时,该组的类可以继承QGraphicsItemGroup类和QObject类。
一般的界面设计也可以继承QWidget类。
一般的文本类可以继承QLabel,比如在设计音乐播放器时的显示桌面歌词的类。
118. 在QtCreator的使用中,有时候会出现两个尖括号在一起的情况,这时候没有语法错误,但是QtCreator这个编辑环境会在你的代码下出现个红色的波纹,让人看起来非常不舒服。例如:
解决方法非常简单,即把两个尖括号中间不要紧挨着,用一个空格号隔开一下即可,这时候红色的波纹警告线就消失了。