Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: XpycT от Август 08, 2009, 10:22



Название: Проблема с диалогом
Отправлено: XpycT от Август 08, 2009, 10:22
У меня в приложении есть Диалог с кнопками, после нажатия на которую в основное приложение должно отправиться ObjectName строкой. Но после отправки все приложение падает, подскажите где ошибка :(
Клас диалога:
Код
C++ (Qt)
#ifndef MOVIESNAMEDIALOG_H
#define MOVIESNAMEDIALOG_H
#include <QDialog>
class QCommandLinkButton;
class MoviesName : public QDialog
{
   Q_OBJECT
public:
   MoviesName(QWidget *parent=0,const QString &httpResponce="");
   QString movieID;
private slots:
   void accept();
private:    
  QCommandLinkButton* createButton(const QString& id,const QString& name);
 
};
#endif // MOVIESNAMEDIALOG_H
Код
C++ (Qt)
#include <QVBoxLayout>
#include <QCommandLinkButton>
#include "moviesnamedialog.h"
MoviesName::MoviesName(QWidget *parent,const QString &httpResponce)
       :QDialog(parent)
{
   setAttribute(Qt::WA_DeleteOnClose);
   setWindowFlags(windowFlags() ^ Qt::WindowContextHelpButtonHint);
   setWindowIcon(QIcon(":/images/icon.png"));
   setWindowTitle(tr("Select movie"));
       QVBoxLayout *layouts=new QVBoxLayout;
 
            QString line = httpResponce;
            QRegExp rx("\\<a.*\\/level\\/1\\/film\\/(\\d+)*\\/sr\\/.*\\>(.*)\\<\\/a\\>,&nbsp;.*(\\d+)\\<\\/a\\>\\<\\/td\\>");
            rx.setMinimal(true);
            QStringList list;
            int pos = 0;
 
            while ((pos = rx.indexIn(line, pos)) != -1) {
                //qDebug() <<rx.cap(1)<< rx.cap(2)<< rx.cap(3);
                pos += rx.matchedLength();
                layouts->addWidget(createButton(rx.cap(1),QString("%1  ( %2 )")
                                               .arg(rx.cap(2)).arg(rx.cap(3))));
 
            }
            setLayout(layouts);
}
QCommandLinkButton* MoviesName::createButton(const QString& id,const QString& name)
{
   QCommandLinkButton* pcmd = new QCommandLinkButton(name);
   pcmd->setObjectName(id);
   connect(pcmd,SIGNAL(clicked()),this,SLOT(accept()));
   return pcmd;
}
void MoviesName::accept()
{    
   QString id=((QCommandLinkButton*)sender())->objectName();
   movieID = id;
   QDialog::accept();
}

И функция вызова с оновного приложения
Код
C++ (Qt)
void MainWindow::searchMovieDescription(const QString &httpResponce)
{
  QString id;
  MoviesName mn(this,httpResponce);
  if(mn.exec())
   id= mn.movieID;
 
  qDebug() << id;
}

Получается в дебаг выводит и падает, а если я создаю диалог как
Код
C++ (Qt)
  QString id;
  MoviesName *mn=new MoviesName (this,httpResponce);
  if(mn->exec())
   id= mn->movieID;
 
  qDebug() << id;
Приложение вообще не получает значение.


Название: Re: Проблема с диалогом
Отправлено: Пантер от Август 08, 2009, 10:30
Код
C++ (Qt)
QCommandLinkButton*button = qobject_cast<QCommandLinkButton*>(sender());
if (button)
   QString id = button->objectName()


Название: Re: Проблема с диалогом
Отправлено: ритт от Август 08, 2009, 10:45
пантер, ай-ай-ай )

Цитировать
MoviesName::MoviesName(QWidget *parent,const QString &httpResponce)
         :QDialog(parent)
 {
-     setAttribute(Qt::WA_DeleteOnClose);
     setWindowFlags(windowFlags() ^ Qt::WindowContextHelpButtonHint);
     setWindowIcon(QIcon(":/images/icon.png"));
     setWindowTitle(tr("Select movie"));


Название: Re: Проблема с диалогом
Отправлено: Пантер от Август 08, 2009, 10:49
Этого не заметил. Ну, я тоже ошибку одну указал. :)


Название: Re: Проблема с диалогом
Отправлено: XpycT от Август 08, 2009, 10:57
Блин спасибо.. вот только не пойму почему у меня в другом дилаоге авторизации стоит setAttribute(Qt::WA_DeleteOnClose) и все прекрасно работает, а тут нет  ???


Название: Re: Проблема с диалогом
Отправлено: pastor от Август 08, 2009, 10:59
Этого не заметил. Ну, я тоже ошибку одну указал. :)

Да, такая проверка не помешает, но в данном контексте коры небудет. Константин раскрыл суть проблемы :)


БТВ: Никаких приведений к QCommandLinkButton делать ненадо. objectName() это методо класса QObject, так что сразу смело можно писать

Код
C++ (Qt)
void MoviesName::accept()
{    
   QString id= sender()->objectName();
   movieID = id;
   QDialog::accept();
}


Название: Re: Проблема с диалогом
Отправлено: pastor от Август 08, 2009, 10:59
Аналогично валится :(

Внимательно перечитай пост Константина


Название: Re: Проблема с диалогом
Отправлено: XpycT от Август 08, 2009, 11:00
Просто пока писал вы ответили )) не успел отредактировать.