qt creator在原窗口基础上新建窗口,inpaint例子的修改

1. 在原窗口基础上新建窗口

在项目名称上右击“add new” -> “qt designer form class” -> 任选一种窗口,确定

在mainwindow.h内添加上面新建窗口的对象作为新的private,添加新的SLOT为按某个按钮新建窗口

在新添加的SLOT内 初始化新窗口,并显示,即可

private slots:
    void on_commandLinkButton_2_clicked();
private:
    Form* secForm;

void MainWindow::on_commandLinkButton_2_clicked()
{
 
    secForm=new Form();
    secForm->show();
}

新窗口上想要显示的组件,按照以前在mainwindow上创建的方式创建即可

2. 在新建窗口中调用原窗口的变量

为新建窗口创建一个public函数,在原窗口中初始化新窗口对象之后,用该对象调用public函数,以原窗口变量为参数,public函数利用参数定义自身组件性质,即可将那些变量传递到新窗口

public:
    explicit Form(QWidget *parent = 0);
    ~Form();
    void setFile(QString img_name, QString msk_name, QString edge_name);

void Form::setFile(QString img_name, QString msk_name, QString edge_name){
 
    pixMap_img=new QPixmap(img_name);
    pixMap_msk=new QPixmap(msk_name);
    pixMap_edge=new QPixmap(edge_name);
    graphicsScene_img->addPixmap(*pixMap_img);
    graphicsScene_msk->addPixmap(*pixMap_msk);
    graphicsScene_edge->addPixmap(*pixMap_edge);
    ui->graphicsView_img->show();
    ui->graphicsView_msk->show();
    ui->graphicsView_edge->show();
}

void MainWindow::on_commandLinkButton_2_clicked()
{
 
    secForm=new Form();
    secForm->setFile(filename,filename_mask,QString::fromStdString(img_edge));
    secForm->show();
}

3. 一个SLOT正在执行时其他无法输入SIGNAL调用其他SLOT,如在我之前的inpainting例子里,按inpaint键时如果还没有输入image和mask时,可通过添加代码弹出messagebox提示异常,但因为inpaint那个slot仍在执行中无法按img或msk钮添加图像,所以只能手动中断程序,重新开始,所以,修改原程序,添加if else语句,如果没有Image图像时inpaint SLOT不再进行其他操作,这样其他按钮就可以click了。

void MainWindow::on_commandLinkButton_clicked()
{
 
    /* proposed method	*/
    std::string image_name=filename.toStdString();
    std::string mask_name=filename_mask.toStdString();
    img0 = imread(image_name, -1);
    if (img0.empty())
    {
 
        QMessageBox::information(this,"error!!","no input image");
    }
    else{
 
        img = img0.clone();
     //   inpaintMask = Mat::zeros(img.size(), CV_8U);
        inpaintMask0=imread(mask_name,-1);
        if(inpaintMask0.empty()){
 
           QMessageBox::information(this,"error!!","no inpaint mask");
        }
        else{
 
            inpaintMask=inpaintMask0.clone();
            if(inpaintMask.size()!=img.size()){
 
                QMessageBox::information(this,"error!!","image and mask don't match', try again");
            }
            else{
 
。。。。

    原文作者:cherylu
    原文地址: https://blog.csdn.net/LL1256/article/details/36015203
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞