(Qt)单击一次按钮后无法使用的窗口

时间:2012-12-14 17:33:55

标签: qt user-interface button opencv click

我有一个带有许多按钮的窗口。每一个都触发一个子程序(使用Opencv API编写)。每个子程序都在窗口上显示图像和内容。

问题是,当我关闭这些窗口时(通过小红叉),所有按钮都变得不可点击。因此,如果我想启动另一个程序,我将不得不退出主窗口并再次运行它。

换句话说,我希望能够运行所有子程序,而不必每次都重新开始。

这是GUI的代码:

的.cpp

#include "fenprincipale.h"
#include "ui_fenprincipale.h"
#include<highgui.h>
 #include<cv.h>
 #include <moyenetmedian.h>
#include<morpho.h>
#include<tracking.h>
#include<contour.h>
#include<QApplication>

FenPrincipale::FenPrincipale(QWidget *parent) :
QWidget(parent),
ui(new Ui::FenPrincipale)

{
ui->setupUi(this);
MoyenEtMedian *moyenEtMedian = new MoyenEtMedian;
morpho * mor = new morpho;
tracking * tra= new tracking;
contour * cont= new contour;

QObject::connect(ui->bMoyMed, SIGNAL( clicked() ), moyenEtMedian, SLOT( exec() ),    Qt::AutoConnection );
QObject::connect(ui->bMorph, SIGNAL( clicked() ), mor, SLOT( exec() ), Qt::AutoConnection );
QObject::connect(ui->bTrack, SIGNAL( clicked() ), tra, SLOT( exec() ), Qt::AutoConnection );
QObject::connect(ui->bCont, SIGNAL( clicked() ), cont, SLOT( exec() ), Qt::AutoConnection );

}



 FenPrincipale::~FenPrincipale()
{
 delete ui;
}

.h:

 #ifndef FENPRINCIPALE_H
  #define FENPRINCIPALE_H

    #include <QWidget>
    #include <QApplication>

    namespace Ui {
    class FenPrincipale;
     }

    class FenPrincipale : public QWidget
   {
     Q_OBJECT

  public:
     explicit FenPrincipale(QWidget *parent = 0);
      void switch_callback(int);
      void execMoyMed (void);


  ~FenPrincipale();

 private:
   Ui::FenPrincipale *ui;
   };

    #endif // FENPRINCIPALE_H

主要班级:

  #include <QCoreApplication>
  #include <QApplication>
  #include <QtGui>
   #include <QWidget>
   #include "fenprincipale.h"

    int main(int argc, char *argv[])
   {
        QApplication a(argc, argv);
        FenPrincipale fenetre;
        fenetre.show();
        return a.exec();

     }

moyenetmedian ”的广告位实施:

 void MoyenEtMedian::exec(void)
{
    const char* name = "Filtres";
    IplImage* img = cvLoadImage( "C:/Users/XELTINFO/ProjetVision/image.png" );
    IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
    cvNamedWindow( name, 1 );
    cvShowImage(name, out);

    // Create trackbar
    cvCreateTrackbar2( "Filtre", name, &g_switch_value, 1,  &MoyenEtMedian::switch_callback, this );

    while( 1 ) {
        switch( filterInt ){
            case 0:
                cvSmooth( img, out, CV_BLUR, 7, 7 );
                break;
            case 1:
                cvSmooth( img, out, CV_MEDIAN, 7, 7 );
                break;
                    }
        if(filterInt != lastfilterInt){
            cvShowImage(name, out);
            lastfilterInt = filterInt;
        }
        if( cvWaitKey( 15 ) == 27 )
            break;
    }

    cvReleaseImage( &img );
    cvReleaseImage( &out );
    cvDestroyWindow( name );

  }

班级声明:

  #ifndef MOYENETMEDIAN_H
   #define MOYENETMEDIAN_H
   #include "ui_fenprincipale.h"
    #include<QObject>

     class MoyenEtMedian : public QObject
    {
   Q_OBJECT
public:
      MoyenEtMedian();
      static void switch_callback(int position, void*);

     public slots :
         void exec(void);

      };

   #endif // MOYENETMEDIAN_H

所有类的类delcarations和slot实现非常相似。如果这还不够,我会补充其余的。

2 个答案:

答案 0 :(得分:1)

您正在阻止exec()插槽中的事件循环,因为它不会立即返回。您应该改为继承QWidget并覆盖keyPressEvent()以从Qt的事件循环中获取键盘输入,而不是执行您当前拥有的忙循环。

答案 1 :(得分:1)

因此,当将Qt与OpenCV一起使用时,我会使用Qt的定时器而不是while循环来设置轮询。

在这里有一个很好的使用QTimers与OpenCV对象交互的教程:

http://www.youtube.com/watch?v=0ONxIy8itRA

跳到35或38分钟,看看他是如何写课的。

基本上,你让Qt进行等待和计时,而不是让等待调用的while循环进行计时。

如果可能,让Qt创建窗口,并将OpenCV窗口嵌套到Qt的窗口中,以便Qt可以管理窗口上的事件。

希望有所帮助。