5-QT5多窗口切换以及所有对话框的实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a3631568/article/details/53725766

这里我要实现的是一个由多个窗口组成而且各个窗口之间可以切换的程序。

实现之前必须了解一些必备知识;

模态非模态对话框的概念:

简单来说就是模态对话框,对话框之间相互不交互,例如退出提示框,而非模态对话框之间相互交互,譬如查找功能。

信号的概念。

简单来说就是,当单击窗口上的一个按钮想要弹出一个对话框,单击这个按钮就会发射一个信号,然后执行槽来显示一个对话框。换句话说就是button的回调函数。。具体深入了解我们往后可以获知,先了解到这。

我们来实现一个自定义对话框,单击第一个按钮进入另一个窗口,单击退出按钮退出。

1..首先,用.ui设计模式设计出两个按钮的界面。然后单击设计器上方的“编辑信号/槽”图标,或者按下快捷键F4进入部件的信号和槽的编辑模式。我在退出按钮设置选择,步骤如图:

 

然后就可以绑定退出按钮与退出功能。

2..现在设置“进入主界面”按钮的信号和槽的关联。

回到编辑模式。快捷键F3。

然后右键第一个按钮选择转到槽,选择click()并确定。如图:

 


然后自动创建on_pushButton_clicked()函数并跳转到此。

这里面我们编写:

void Dialog::on_pushButton_clicked()
{
    accept();
}


也就是说,当这个按钮被按下的时候,执行accept()函数。而accpet()函数也是一个回调函数,也是一个槽。使用exec()函数会返回QDialog::Accepted值。换句话说就是使用这个值来判断是哪个按钮被按下了。

我们再新建一个新的.ui文件,内容如下:


这个作为主界面,还有一个返回按钮

 

然后在主函数的代码:

int main(int argc,char **argv){
    QApplication a(argc,argv);
    MainWindow w;//创建主界面
    Dialog d;//创建对话框。
    if(d.exec() == QDialog::Accepted){//当按钮“进入主界面”被按下则执行
       w.show();
       return a.exec();
    }
    return 0;//否则退出程序
}

 

这个时候就可以运行,点击进入主界面会直接进主界面,但是主界面的按钮还没绑定信号与槽。

3..现在来绑定主界面的按钮。

主界面的按钮的槽:

#include<dialog.h>
void MainWindow::on_pushButton_clicked()
{
    close();
    Dialog d;
    if(d.exec() == QDialog::Accepted)
       show();
}
 


PS:需要注意的是close()槽,它不一定让程序退出,只有当最后一个主界面调用close()程序才会退出,否则只是隐藏界面,并没有被销毁

 

 

  

 

让我们来点更加复杂的程序:

 

这里我们简单地了解并且实现颜色对话框、文件对话框、字体对话框、输入对话框、消息对话框、进度对话框、错误信息对话框和向导对话框。

 

1..先创建一个主界面:


我这里命名为:MainDialog。属于对话框形式

2..然后给每一个按钮都添加信号。

(右键按钮---转到槽—选择click()---确定之后自动创建,自动转到代码处)

3..颜色对话框。

头文件添加#include<QColorDialog>

 

void MainDialog::on_pushButton_clicked()
{
    QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"));//创建颜色对话框
}

结果:


4..文件对话框。

头文件添加#include<QFileDialog>

然后进入文件对话框按钮的单击信号槽,代码:

void MainDialog::on_pushButton_3_clicked()
{
    QString fileName=QFileDialog::getOpenFileName(this, tr("文件对话框"), "F:", tr("图片文件(*png*jpg )"));
  
}


四个参数分别是:指定父窗口、设置对话框标题、指定默认打开的目录路径和设置文件类型过滤器。过滤器规则(*png和*jpg需要空格,而且当括号为中文时,jpg后面需要空格,最好的方法就是括号要英文)。如果需要设置多个不同类别的过滤器,只需要使用两个分号,例如:”图片文件(*png *jpg);;文本(*txt)”.

如果要同时选择多个文件,则把上式改为:

QStringList fileNames= QFileDialog::getOpenFileNames(this,tr("文件对话框"),"F:",tr("图片文件(*png*jpg)"));

另外,QFileDialog类还提供了getSaveFileName()函数来实现保存文件对话框和文件另存为对话框,还有getExistingDirectory()函数来获取一个已经存在的文件夹路径。

 

运行结果:


5..字体对话框。

添加#include<QfontDialog>

代码:

void MainDialog::on_pushButton_2_clicked()
{
    bool ok;//作为标识符
    QFont font=QFontDialog::getFont(&ok, this);//如果单击OK按钮,那么让字体对话框使用新字体
    if(ok)
       ui->pushButton_2->setFont(font);
    else
       qDebug()<<"没有选择字体!";
 
}

运行结果:

 

6..输入对话框。

头文件添加#include<QInputDialog>

代码:

void MainDialog::on_pushButton_4_clicked()
{
    bool ok;
    QString string = QInputDialog::getText(this, tr("输入字符串对话框"), tr("请输入用户名:"), QLineEdit::Normal, tr("admin"),&ok);
    int value = QInputDialog::getInt(this, "请输入整数对话框", "请输入-1000到1000之间的数值", 100, -1000, 1000, 10, &ok);
    QStringList items;//条目
    items << "条目1" << "条目2" << "条目3";
    QString item = QInputDialog::getItem(this, "输入条目对话框", "请选择一个条目", items, 0, true, &ok);
}

运行结果:

 


 

7..消息对话框。

添加头文件#include<QMessageBox>.

代码:

void MainDialog::on_pushButton_5_clicked()
{
    int ret = QMessageBox::question(this, "问题对话框"
                                  ,"你了解Qt吗?", QMessageBox::Yes,QMessageBox::No);
    qDebug() << ret << "  " << QMessageBox::Yes << "  " << QMessageBox::No;
    int ret2 = QMessageBox::information(this, "提示对话框", 
                                      "这是QT书籍", QMessageBox::Ok);
    qDebug() << ret2 << "  " << QMessageBox::Ok;
    int ret3 = QMessageBox::warning(this, "警告对话框" 
                                  , "不能提前结束", QMessageBox::Abort);
    qDebug() << ret3 << "  " << QMessageBox::Abort;
    int ret4 = QMessageBox::critical(this, "严重错误对话框"
                                   , "发现严重错误,需要关闭程序", QMessageBox::YesAll);
    qDebug() << ret4 << "  " << QMessageBox::YesAll;
    QMessageBox::about(this, ("关于对话框"), "感谢作者!");
}

 结果:





对应的QMessageBox::的值如下:


如果要使用自己的图标和自定义按钮,就可以创建QMessageBox类对象,然后使用相关函数进行操作。

8..进度对话框。

头文件添加:#include<QProgressDialog>

 

代码:

void MainDialog::on_pushButton_6_clicked()
{
    QProgressDialog dialog("文件复制进度","取消",0,50000,this);
    dialog.setWindowTitle("进度对话框");
    dialog.setWindowModality(Qt::WindowModal);//将对话框设置为模态的
    dialog.show();//于是这个show()就变成了模态对话框
    //演示复制进度
    for(int i = 0; i <= 50000; i++){
       dialog.setValue(i);//设置进度条的当前值
       QCoreApplication::processEvents();//避免界面冻结
       if(dialog.wasCanceled()){
           qDebug("取消复制");
           break;//如果按下取消,则中断
       }
       if(i == 50000)
           qDebug("复制结束");
    }
}
 

 

运行结果:


当取消时,控制台会打印取消复制,当复制完成,控制台会打印复制结束。

 

9..错误信息对话框。

头文件添加:#include<QErrorMessage>

代码:

void MainDialog::on_pushButton_7_clicked()
{
    QErrorMessage *dialog = newQErrorMessage(this);
    dialog->setWindowTitle("错误信息对话框");
    dialog->showMessage("这里是出错信息!");
}

运行结果:


这里新建的函数以非模态形式显示出来,对话框中还有一个复选框,可以选择以后是否还要显示相同错误信息。

 

 

10..向导对话框。

头文件添加:#include<QWizard>

代码如下:

先在.ui界面生成的.h文件上添加private类型的函数声明

private:

    Ui::MainDialog*ui;

 

    //添加的部分

    QWizardPage *createPage1();

    QWizardPage *createPage2();

 

然后具体化函数:

 

QWizardPage *MainDialog::createPage1(){
    QWizardPage *page = newQWizardPage();
    page->setTitle("介绍");
    return page;
}
QWizardPage *MainDialog::createPage2(){
    QWizardPage *page = newQWizardPage();
    page->setTitle("结束");
    return page;
}

 

这里添加按钮的单击信号槽。

 

//向导对话框
voidMainDialog::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle("向导对话框");
    wizard.addPage(createPage1());//添加向导页面
    wizard.addPage(createPage2());
    wizard.exec();
}


最后结果:


 

这里的几大基本对话框全部讲完,如果要深入每个部件,Qt提供了一个示例程序Standard Dialogs,它在Dialogs分类中。

展开阅读全文

没有更多推荐了,返回首页