Qt 经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等。
信号与槽 连接一个信号和槽函数,它们分别来自不同(也可以是相同)的对象,也即connect
是对象之间快速通信的桥梁。
#include <QtGui/QApplication> #include <QtGui/QPushButton> int main (int argc, char *argv[]) { QApplication a (argc, argv) ; QPushButton *button = new QPushButton ("Quit" ); QObject::connect (button, SIGNAL (clicked ()), &a, SLOT (quit ())); button->show (); return a.exec (); }
QObject::connect (button, SIGNAL (clicked ()), &a, SLOT (quit ()));
事件 可以通过事件来改变组件的默认操作
QApplication
的exec()
就是事件循环,用来监听所有事件;当事件发生时,Qt将创建一个事件对象,然后传递给event()
。
事件函数需要在子类中重写。重写事件函数其实就是在告诉系统,当遇到这个事件的时候应该做什么。
paintEvent()
在程序开始的时候会update()
一次,后面绘制图形需要再调用update()
。
绘画事件 通过绘画事件函数void paintEvent(QPaintEvetn *event)
画图,可以通过设置状态来控制画什么。
update()
函数用来更新绘画事件函数。
普通绘画:
paint.setPen (QPen (QColor (Qt::black), 1 )); paint.setBrush (Qt::black); paint.drawEllipse (100 ,100 ,300 ,300 );
绘制透明填充:
QColor color = Qt::white; color.setAlphaF (0.5 ); paint.setPen (QPen (color)); paint.setBrush (color); paint.drawEllipse (100 ,100 ,300 ,300 );
鼠标事件 鼠标悬浮事件可以使用QWidget
的参数setMouseTracking
完成,但必须在所有上层控件中都设置setMouseTracking(true)
才可以实现;比如QMainWindow
类的监控必须同时在MainWindow
和其父类QWidget
中都设置setMouseTracking(true)
。
然后重写mouseMoveEvent
函数。使用event->HoverMove
判断事件类型。
消息对话框 可选按键的消息对话框 可直接使用静态函数实现有可选按钮的消息对话框:
QMessageBox mb; mb.setWindowTitle (tr ("Black is Win!" )); mb.setText (tr ("Black is win!" )); mb.setInformativeText (tr ("Are you want to play again?" )); mb.setStandardButtons (QMessageBox::Yes | QMessageBox::No | QMessageBox::Default); mb.setDefaultButton (QMessageBox::Yes); switch (mb.exec ()) { case QMessageBox::Yes: newGame (); break ; case QMessageBox::No: exit (); break ; default : break ; }
or
QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; QMessageBox::StandardButton result; result = QMessageBox::question ( this , "Black is Win!" , "Game over! Are you want to play again?" , QMessageBox::Yes | QMessageBox::No, defaultBtn); if (result == QMessageBox::Yes) ui->plainTextEdit->appendPlainText ("Question消息框: Yes 被选择" ); else if (result == QMessageBox::No) ui->plainTextEdit->appendPlainText ("Question消息框: No 被选择" ); else ui->plainTextEdit->appendPlainText ("Question消息框: 无选择" );
or
QMessageBox::information ( this , "Black is Win!" , "Game over! Are you want to play again?" );
控件设置 QLabel *l = new QLabel (this ); QFont font; font.setFamily ("Times New Roman" ); font.setPixelSize (20 ); l->setFont (font); QString s = QString::number (whiteTime); l->setText (s + "s" ); QPalette palette; palette.setColor (QPalette::Window, QColor (0 , 0 , 0 )); palette.setColor (QPalette::WindowText, Qt::white); l->setPalette (palette); l->show ();
使用l->update()
可以更新控件显示的内容。
QPalette QPalette::Window (); QPalette::WindowText (); QPalette::setColor (); QPalette::setBrush (); QPalette::setColor (ColorRole r,const Qcolor &c); QPalette::setColor (ColorGroup gr,ColorRole r,const QColor &c); xxx->setAutoFillBackground (true ); Qpalette p=xxx->palette (); p.setColor (QPalette::Window,color); xxx->setPalette (p);
定时器 QTimer *t = new QTimer (this ); t->start (1000 ); connect (t, SIGNAL (timeout ()), this , SLOT (time ()));
字体 xxx->setFont (QFont ("宋体" ,20 ,QFont::Bold)); QFont font; font.setFamily ("宋体" ); font.setPixelSize (50 ); font.setBold (true ); font.setItalic (true ); font.setPointSize (20 ); font.setStyle (QFont::StyleItalic); font.setWeight (QFont::Light); font.setOverline (true ); font.setUnderline (true ); font.setStrikeOut (true ); font.setLetterSpacing (QFont::PercentageSpacing,300 ); font.setLetterSpacing (QFont::AbsoluteSpacing,20 ); font.setCapitalization (QFont::Capitalize); QFontMetrics fm (font) ;qDebug () << fm.height (); qDebug () << fm.maxWidth ();QFontInfo fInfo (font) ;qDebug () << fInfo.family () <<" " <<fInfo.style () << fInfo.pixelSize () << fInfo.overline ();qApp->setFont (font);
QLabel 显示富文本 QString lineHeightStr = "<p style='line-height:%1px'>%2</p>" ; QString fontColorStr = "<font color = #959595>%1</font><font color = #000000>%2</font>" ; QString textStr = lineHeightStr.arg (scaleConver (30 )).arg (fontColorStr.arg ("您于14天内到达或途经:" ,"浙江省杭州市,河南省许昌市,广州省广州市,辽宁省大连市" )); ui->label_city->setText (textStr); label->setText ( QObject::tr ("<font color = red>%1</font>" ).arg ("abc" ))+ QObject::tr ("<font color = blue>%1</font>" ).arg ("efg" )+ "hij" ); QSize nSize (300 ,25 ) ;m_pStatic = new QLabel ((QWidget*)GetUIWnd ()); m_pStatic->resize (nSize); QString strText = QString::fromStdWString (_CS(L"<font style = 'font-size:14px; font-weight:bold'>You Can See it from this: </font> <font style = 'color:#2C5DFF; font-size:14px; font-weight:bold'> %1 </font> <font style = 'font-size:14px; font-weight:bold'>example.</font>" )).arg (0 ); m_pStatic->setText (strText);