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{
。。。。