Russian Qt Forum
Ноябрь 05, 2024, 08:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с диалогом  (Прочитано 4833 раз)
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;
Приложение вообще не получает значение.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 08, 2009, 10:30 »

Код
C++ (Qt)
QCommandLinkButton*button = qobject_cast<QCommandLinkButton*>(sender());
if (button)
   QString id = button->objectName()
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ритт
Гость
« Ответ #2 : Август 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"));
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 08, 2009, 10:49 »

Этого не заметил. Ну, я тоже ошибку одну указал. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
XpycT
Гость
« Ответ #4 : Август 08, 2009, 10:57 »

Блин спасибо.. вот только не пойму почему у меня в другом дилаоге авторизации стоит setAttribute(Qt::WA_DeleteOnClose) и все прекрасно работает, а тут нет  Непонимающий
« Последнее редактирование: Август 08, 2009, 10:59 от XpycT » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Август 08, 2009, 10:59 »

Этого не заметил. Ну, я тоже ошибку одну указал. Улыбающийся

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


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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Август 08, 2009, 10:59 »

Аналогично валится Грустный

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
XpycT
Гость
« Ответ #7 : Август 08, 2009, 11:00 »

Просто пока писал вы ответили )) не успел отредактировать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.215 секунд. Запросов: 22.