Qt主程序主要有两种,一是Qt控制台程序,而是Qt GUI应用程序。
Qt控制台程序很少用到,这里仅仅简单了解。
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout<<"helloworld"<<endl;
return a.exec();
}
以上代码就是简单的Qt控制台程序,创建了一个QCoreApplication 对象a,并输出hello world,最后a调用.exec()。QCoreApplication为非GUI的Qt程序提供主事件循环,负责处理和派发操作系统和其他事件,调用exec()才能启动事件循环。如果去掉第一和第三行代码,其实就是一个普通的C++程序,一样可以运行。
int main(int argc, char *argv[])
{
//QCoreApplicationa(argc, argv);
cout<<"helloworld"<<endl;
//returna.exec();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel label("helloworld");
label.show();
return a.exec();
}
和Qt控制台程序类似,需要创建一个QApplication对象,并调用exec()。QApplication继承QCoreApplication,用于管理GUI程序的控制流和主要的设置。每个GUI程序都只能有一个QApplication对象,而且必须最先被创建。
信号和槽机制是Qt的核心特性,主要用与对象之间的通信。
在用的时候需要用SIGNAL() 和SLOT()宏指定信号和槽函数。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton *pQuitBtn = new QPushButton("Quit");
QObject::connect(pQuitBtn,SIGNAL(clicked()),&a,SLOT(quit()));
pQuitBtn->show();
returna.exec();
}
这里把按钮的clicked()信号与QApplication对象的quit()槽连接起来。当单击按钮时,按钮发出信号,槽函数quit()将自动被执行,程序便退出。
槽函数和普通的C++成员函数差不多,可以是虚函数,可以被重载;可以是公有,私有或者保护的;也可以被直接调用;它们的参数可以是任意类型。
1. 一个信号可以连接多个槽,在发射信号的时候,会以不确定的顺序一个接一个的调用槽函数。
2. 多个信号可以连接同一个槽,无论发射哪个信号,都会调用连接的槽函数。
3. 一个信号可以与另外一个信号相连接。
4. 连接可以被移除。
bool QObject::disconnect ( constQObject * sender, const char * signal, const QObject * receiver,const char *method )
5. 信号和槽的参数必须具有相同的顺序和相同的类型。如果信号的参数比槽的参数多,多余的参数将被忽略掉。如果参数类型不匹配,或者如果信号或槽不存在,Qt会在运行时发出警告。如果在信号和槽的名字中包含了参数名,Qt也会发出警告。
QMainWindow类提供了一个程序主窗口基本框架。其框架图如下:
可以调用setCentralWidget().设置中央窗口部件。
menuBar()返回了窗口的QMenuBar,可以调用QMenuBar::addMenu()给窗口添加新的菜单。QMainWindow自带有默认菜单栏,如果你想实现自己的菜单栏,你也可以调用setMenuBar()设置自己的菜单栏。例如:
void MainWindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);
fileMenu->addAction(openAct);
fileMenu->addAction(saveAct);
}
可以调用addToolBar()给窗口添加工具栏,而且可以指定Qt::ToolBarArea控制工具栏的起始位置。可以通过QToolBar::setAllowedAreas() and QToolBar::setMovable()限制布局。
void MainWindow::createToolBars()
{
fileToolBar = addToolBar(tr("File"));
fileToolBar->addAction(newAct);
}
调用addDockWidget()给窗口添加停靠窗体。
QDockWidget *dockWidget = new QDockWidget(tr("Dock Widget"), this);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea);
dockWidget->setWidget(dockWidgetContents);
addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
QMainWindow有默认的状态栏,可以调用statusBar()获取默认的状态栏,也可以调用setStatusBar()设置自己的状态栏。可以调用saveState()和restoreState()保存和获取其布局状态。
QDialog是Qt所以对话框的基类,我们可以继承QDialog实现自定义的对话框。QDialog分为模态和非模态对话框,有返回值,默认按钮。如果有parent,其默认的位置为parent的中部。
模态对话框分两种:应用程序模态对话框和窗口模态对话框。应用程序模态对话框会阻塞整个应用程序,而窗口模态对话框只阻塞与对话框关联的窗口,用户依然可以使用程序的其他窗口。
我们通常调用exec() 来显示模态对话框,关闭对话框时,exec() 会有一个返回值。
我们通常调用show()显示非模态对话框。如果隐藏了一个对话框后再次调用show(),对话框将显示在其原始的位置。
当用户按下Enter(Return)键时默认按钮将被按下。这表示用胡接受了对话框设置并将关闭对话框。可以用QPushButton::setDefault(), QPushButton::isDefault() 和 QPushButton::autoDefault()设置控制对话框默认按钮。
QColorDialog |
Dialog widget for specifying colors |
QFileDialog |
Dialog that allow users to select files or directories |
QFontDialog |
Dialog widget for selecting a font |
QInputDialog |
Simple convenience dialog to get a single value from the user |
QMessageBox |
Modal dialog for informing the user or for asking the user a question and receiving an answer |
QPageSetupDialog |
Configuration dialog for the page-related options on a printer |
QPrintDialog |
Dialog for specifying the printer's configuration |
QPrintPreviewDialog |
Dialog for previewing and configuring page layouts for printer output |
QProgressDialog |
Feedback on the progress of a slow operation |
管理窗口部件布局的三种方法:绝对位置法,人工布局法和布局管理器法。
绝对位置法:在构造函数中,各个子窗口部件通过调用SetGeometry()函数来分配固定的大小和位置实现。
绝对位置法的缺点:
1. 用户无法改变窗口的大小
2. 如果用户选择了一种不常用的大字体,或者当应用程序被翻译成另外一种语言时,也许会把一些文本截断。
3. 对于某些风格的平台,这些窗口部件可能会有不合适的尺寸大小。
4. 必须人工的计算位置和大小。
人工布局法:通过重新实现窗体的resizeEvent()函数,在该函数中各个子窗口部件通过调用SetGeometry()来设置几何形状实现的。利用这种方法给子窗口部件设置的大小尺寸总是可以和窗口的大小成比例。
布局管理器会为每种类型的窗口部件提供一些合理的默认值,并且会考虑每一个窗口部件的大小提示,会自动调整布局来响应字体的变化,内容的改变以及窗口大小的调整。Qt提供了三种布局管理器:QHBoxLayout,QVBoxLayout和QGridLayout。