C++ GUI Qt4编程-创建主窗口

来源:互联网 发布:软件测试考试题库 编辑:程序博客网 时间:2024/04/30 23:47

        应用程序的主窗口提供了用于构建应用程序用户界面的框架,包含菜单,工具栏,状态栏,对话框等控制。

1.子类化QMainWindow

        通过子类化QMainWindow可以创建一个应用程序的主窗口。由于QDialog和QMainWindow都派生自QWidget,所以通过创建对话框来创建主窗口同样适用。

        classs MainWindow :public QMainWindow

        {

              Q_OBJECT

         public:

              MainWindow();

         protected:

             //closeEvent()函数是QWidget类中的一个虚函数,当用户关闭窗口时,这个函数会被自动调用,类MainWindow中重新实现了它,这样就可以在关闭的时候向用户询问。

             void closeEvent(QCloseEvent *event);

        }

 

        MainWindow::MainWindow()

        {

             spreadsheet = new Spreadsheet;

             //把spreadsheet窗口部件设置为主窗口的中央部件,中央部件会占用主窗口的中央区域部分。

             setCentralWidget(spreadsheet);

             //把窗口左上角的图标设置为icon.png,Qt支持很多图像个数,包括BMP,GIF,JPEG,PNG,PNM,SVG,TIFF,XBM,XPM。

             setWindowIcon(QIcon(":/images/icon.png"));

        }

 

        1)绝大多数的槽都把void作为它们的返回值,当槽作为一个信号的响应函数而被执行时,就会忽略这个返回值,但是当把槽作为函数来调用时,其返回值对我们的作用就和调用任何一个普通的C++函数时的作用是相同的。

        2)还没有一种与平台无关的可在桌面上显示应用程序图标的设置方法。与平台相关的桌面图标设置方法在http://doc.trolltech.com/4.3/appicon.html中进行阐述。

        3)图形用户界面在应用程序处理图片的方法

                (1)把图片保存到文件中,在运行时动态载入。

                (2)把XPM文件包含在源代码中,因为XPM文件也是有效的C++文件。

                (3)使用Qt的资源机制(适用于所支持的任意文件格式,把需要处理的图片存放在源代码树中名为images的子目录下)。

2.创建菜单和工具栏

        1)创建菜单和工具栏的步骤

                (1)创建并且设置动作。

                (2)创建菜单并且把动作添加到菜单上。

                (3)创建工具栏并且把动作添加到工具栏上。

        2)创建菜单/上下文菜单/工具栏/状态栏的代码示例

                 void MainWindow::createActions()

                 {

                        //创建动作对象

                        newAction = new QAction(tr("&New"), this);

                        //图标

                        newAction->setIcon(QIcon(":/images/new.png"));

                        //对各平台设置正确的快捷键

                        newAction->setShortcut(QKeySequence::New);

                        //状态提示

                        newAction->setStatusTip(tr("Create a new spreadsheet file"));

                        //设置信号对应的槽(能够确保点击菜单/对应的图标/对应的快捷键都可以调用槽)

                        connect(newAction, SIGNAL(triggered()), this, SLOT(newFile)));

                 }

                 void MainWindow::createMenus()

                 {

                         //创建QMenu窗口部件并添加到菜单栏中,menuBar()返回指向QMenuBar的指针,菜单栏会在第一次调用menuBar()函数的时候创建出来。

                         fileMenu = menuBar()->addMenu(tr("&File"));

                         //添加一个newAction动作到菜单中

                         fileMenu->addAction(newAction);

                         //才菜单中添加一个间隔器,可以把视觉上关系密切的项放在一起。

                         fileMenu->addSeparator();

                         //添加子菜单,一个菜单与它所属的菜单一样,也是一个QMenu。

                         selectSubMenu = filemenu->addMenu(tr("&Select"));

                 }

                 void MainWindow::createContextMenu()

                 {

                         //任何窗口部件都可以有一个与之相关联的QAction列表,要为该应用程序提供上下文菜单,可以将所需的动作添加到窗口部件中。

                         spreadsheet->addAction(cutAction);

                         //设置上下文菜单策略设置为一个显示这些动作的上下文菜单。

                         spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);

                 }

                 一种更为高级的提供上下文菜单方法是重新实现QWidget::contextMenuEvent()函数,创建一个QMenu窗口部件,在其中添加锁期望的那些动作,并且在对该窗口部件调用exec()函数。

                 void MainWindow::createToolBars()

                 {

                         //添加工具栏

                         fileToolBar = addToolBar(tr("&File"));

                         //添加动作

                         fileToolBar->addAction(newAction);

                         //添加间隔器

                         fileToolBar->addSeparator();

                 }

                 void MainWindow::createStatusBar()

                 {

                         locationLabel = new QLabel("W999");

                         //设置对齐方式

                         locationLabel->setAlignment(Qt::AlignHCenter);

                         //提供窗口一个理想的大小

                         locationLabel->setMinimumSize(locationLabel->sizeHint);

                         formulaLabel = new QLabel;

                         formulaLabel->setIndex(3);

                         //statusBar()函数返回指向状态栏的指针,添加到状态栏的QLabel会自动被重定义父对象,让他们成为状态栏的子对象,第一次调用statusBar()函数时会创建状态栏。

                         statusBar()->addWidget(locationLabel);

                         //状态栏指示器是一些简单的QLabel,在任何需要的时候改变它们的文本。已经在formulaLabel中添加了一个缩进格式,以便让那些显示的文本左边有一个小的偏移量。

                         statusBar()->addWidget(formulaLabel, 1);    //指定了一个伸展因子1,默认是0,多余的空间分配到了右边的对象中。

                         connect(spreadsheet, SIGNAL(currentCellChange(int,int,int,int)), this, SLOT(updateStatusBar()));

                         connect(spreadsheet, SIGNAL(modified()), this, SLOT(spreadsheetModified()));

                         locationLabel->setText(spreadsheet->currentLocation());

                         formulaLabel->setText(spreadsheet->currentFormula());

                         //用以更新标题栏,新位置,公式指示器等。

                         setWindowModified(true);

                 }

 

3.使用对话框

           1)对话框的显示

                void MainWindow::find

                {

                     findDialog = new FindDialog(this);

                     //非模态对话框显示,窗口是可见的。

                     findDialog->show();

                     //确保窗口位于其他窗口之上

                     findDialog->raise();

                     //窗口是激活的状态

                     findDialog->activateWindow();

                     //模态窗口的显示方法

                     if(findDialog.exec())  //ok返回true值(QDialog::Accepted),否则返回false值(QDialog::Rejected)。

                     {...}

                }

               (1) 本应该在MainWindow的构造函数中创建这个对话框,但是推迟对话框的创建过程将可以使程序的启动更加快速,还有,如果从来没有使用到这个对话框,那么它就不会被创建,这样可以既节省时间又节省内存。

               (2)通过void setModal(bool modal)来设置对话框的模态性,当modal设置为true时,默认对整个应用程序模态。

               (3)通过void setWindowModality(Qt::WindowModality windowModality)来设置模态性,Qt::WindowModality有以下取值,Qt::Nodal:非模态,Qt::WindowModal:窗口模态,Qt::ApplicationModal:应用程序模态。

               (4)通过Qt::WindowModality windowModality() const得到窗口的模态性。

               (5)通过 bool isModal() const判断窗口是否为模态的。

 

4.存储设置

        默认情况下,QSetting会存储应用程序中与特定平台相关的一些设置信息。在windows系统中,它使用的是系统注册表,在UNIX系统中,它会把设置信息存储在文本文件中,在Mac OS X中,它会使用Core Foundation Preferences的应用程序编程接口。

        void MainWindow::writeSettings()

        {

            //参数说明了组织的名字和应用程序的名字,采用平台相关的方式,可以利用这一信息查找这些设置所在的位置。

            QSettings settings("Software Inc", "Spreadsheet");

            settings.setValue("geometry", saveGeometry);

        }

       

5.多窗口

        setAttribute(Qt::WA_DeleteOnClose);    //在窗口关闭时删除对应的对象。

6.程序启动画面

        int main(int argc, char *argv[])

        {

            QApplication app(argc, argv);

            QSplashScreen *splash = new QSplashScreen;

            splash->setPixmap(QPixmap(":/images/splash.png"));

            splash->show();

            splash->showMessage(QObject::tr("Setting up the main window..."),  topRight, Qt::while);

            MainWindow mainWindow;

            splash->finish(&mainWindow);

            delete splash;

        }

0 0