@dragonfive
2016-04-03T14:34:58.000000Z
字数 3022
阅读 849
未分类
qdebug Stack Overflow
QT与vs的配置
Qt的类
Qt5中,对于QString常量,建议使用QStringLiteral宏。
QString s = QStringLiteral("你好");
C++:Unicode字符集下CString转string
CString与LPCWSTR、LPSTR、char*、LPWSTR等类型转换
QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject
因为一个窗口只有一个菜单栏,但是却可能有多个工具栏。
SpinBox就是只能输入数字的输入框,并且带有上下箭头的步进按钮。
QSlider则是带有滑块的滑竿
QSpinBox的确有两个信号:
void valueChanged(int)
void valueChanged(const QString &)
当我们使用&QSpinBox::valueChanged取函数指针时,编译器不知道应该取哪一个函数
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
完成了一个双向的数据绑定。当然,对于 Qt 自己的信号函数,我们可以比较放心地使用。但是,如果是我们自己的信号,应当注意避免发生无限循环!
如果我们把(const QString &, const QDate &)两个参数修改成(const QDate &, const QString &),C 风格的强制类型转换就会失败,并且这个错误只能在运行时发现。而第二种则是 C++ 推荐的风格,当参数类型改变时,编译器会检测到这个错误。
QObject::connect(&newspaper,
static_cast(&Newspaper::newPaper),
&reader,
&Reader::receiveNewspaper);
我们信号的参数实际是作为一种返回值,所以必须是引用的方式
有一种情况,槽函数的参数可以比信号的多,那就是槽函数的参数带有默认值
Qt 提供了几种布局管理器供我们选择:
QHBoxLayout:按照水平方向从左到右布局;
QVBoxLayout:按照竖直方向从上到下布局;
QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;
QFormLayout:按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
QStackedLayout:层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。
Qt 使用QDialog::exec()实现应用程序级别的模态对话框,使用QDialog::open()实现窗口级别的模态对话框,使用QDialog::show()实现非模态对话框。
dialog->setAttribute(Qt::WA_DeleteOnClose);该函数会在当前事件循环结束时销毁该对话框(具体到这里,需要使用exec()开始一个新的事件循环)
Qt 的内置对话框大致分为以下几类:
QColorDialog:选择颜色;
QFileDialog:选择文件或者目录;
QFontDialog:选择字体;
QInputDialog:允许用户输入一个值,并将其值返回;
QMessageBox:模态对话框,用于显示信息、询问问题等;
QPageSetupDialog:为打印机提供纸张相关的选项;
QPrintDialog:打印机配置;
QPrintPreviewDialog:打印预览;
QProgressDialog:显示操作过程。
QMessageBox有几个静态函数可以来生成对话框:
void about(QWidget * parent, const QString & title, const QString & text):显示关于对话框。只有一个 OK 按钮
void aboutQt(QWidget * parent, const QString & title = QString()):显示关于 Qt 对话框。该对话框用于显示有关 Qt 的信息。
有几个函数返回值是StandardButton 参数序列为:QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
有 critical(严重错误对话框),information(信息对话框),question(问题对话框),warning(警告)
有两个静态函数
getOpenFileName()
getSaveFileName()
QString 自带的:
QString QString::fromAscii ( const char * str, int size = -1 )
QString QString::fromLatin1 ( const char * str, int size = -1 )
QString QString::fromLocal8Bit ( const char * str, int size = -1 )
QString QString::fromUtf8 ( const char * str, int size = -1 )
使用实例方法
QString QTextCodec::toUnicode ( const char * chars )
和
fromUnicode(const QString &str).data();把Qstring转化为string
Qt 中的事件都是 protected 的,因此,重写的函数必定存在着其父类中的响应函数
事件的传播是在组件层次上面的,而不是依靠类继承机制。
QString msg;msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",event->x(), event->y());this->setText(msg);
为什么要点击鼠标之后才能在mouseMoveEvent()函数中显示鼠标坐标值?这是因为QWidget中有一个mouseTracking属性,该属性用于设置是否追踪鼠标。只有鼠标被追踪时,mouseMoveEvent()才会发出。如果mouseTracking是 false(默认即是),组件在至少一次鼠标点击之后,才能够被追踪,也就是能够发出mouseMoveEvent()事件。如果mouseTracking为 true,则mouseMoveEvent()直接可以被发出。知道了这一点,我们就可以在main()函数中直接设置下
event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了
为什么我需要使用事件,而不是信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的。事件的另外一个好处是,它可以使用过滤器。