crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Неактивные кнопки меню
NordWest
  опции профиля:
сообщение 8.4.2009, 0:35
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Здравствуйте.
Проблема с кнопками в меню MainWindow. В процессе разработки обнаружился такой глюк. Несколько пунктов меню: file, view, frame и tools. Но отзывается на подведение мыши и клик только последняя кнопка. Остальные не становятся выпуклыми и никак не реагируют.
Но если открыть последнее меню, то можно из него передвигаться в остальные. Кривой такой способ работы получается.

В результате попыток выявления источника, влияющего на возникновение проблемы, пробовал отключать участки кода. В результате нашел ту часть кода, при удалении которой, меню оживает.
Связана она с моим первым ui-диалогом, который имеет одно поле QLineEdit и две кнопки: Ok и Cancel.

Но по порядку...

Для начала MainWindow:
MainWindow::MainWindow()
{
    setWindowTitle("stimpro");
    setMenu();
    setWidgets();
...    
    imgLabel->installEventFilter(this);
    this->installEventFilter(this);
};


Собственно методы setMenu() и setWidget() имеют смысл, поэтому немного сократил.

Теперь setMenu():
    
fileMenu = menuBar()->addMenu(tr("file"));// добавляем меню file
...
viewMenu = menuBar()->addMenu(tr("view"));
...
frameMenu = menuBar()->addMenu(tr("frame"));
...
toolMenu = menuBar()->addMenu(tr("Tools"));
...


Наполнение меню похоже также несущественно.

И наконец setWidget(), в котором создается объект типа newNameDlg:
nName = new newNameDlg(this);
nName->formWidget->hide();
connect(nName, SIGNAL(signalExit()), this, SLOT(slotNewInsExit()));


В самом классе мне не за что зацепиться. Нужен был диалог и я его создал как попроще. Видимо я криво связал сигналы со слотами...

"newNameDlg.h"
#include <QWidget>
#include <QDialog>

class QLabel;
class QPushButton;
class QLineEdit;

class newNameDlg : public QWidget
{
    Q_OBJECT
signals:
    void signalExit();
public:
    newNameDlg(QWidget *parent = 0);
    QWidget *formWidget;

private slots:
    void on_buttonBox_accepted();
public:
    QLineEdit *ui_newNameLine;
};


"newNameDlg.cpp"
#include <QtUiTools>
#include <QtGui>

#include "newNameDlg.h"

newNameDlg::newNameDlg(QWidget *parent)
    : QWidget(parent)
{
    QUiLoader loader;

    QFile file("newNameDlg.ui");
    file.open(QFile::ReadOnly);
    formWidget = loader.load(&file, this);
    formWidget->show();
    file.close();

    ui_newNameLine = qFindChild<QLineEdit*>(this, "nameIns");

    QMetaObject::connectSlotsByName(this);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(formWidget);
    setLayout(layout);
}

void newNameDlg::on_buttonBox_accepted(){emit signalExit();}


Такая вот история.

Сообщение отредактировал Admin - 8.4.2009, 8:24
Причина редактирования: Подредактировал тэг code и добавил expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 8.4.2009, 10:23
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Разобрался. :yahoo:
Если конечно я все провельно понял. newNameDlg это же диалоговае окно, я правильно понимаю, а не виджет на форме MainWindow?
Поэтому данный класс должен наследоваться от QDialog, а не от QWidget.
Конструктор класса я упростил до
newNameDlg::newNameDlg(QWidget *parent)
    : QDialog(parent)
{
    QUiLoader loader;
    QFile file("D:/WorkProject/Qt_Project/Oscilloscope/newNameDlg.ui");
    if (file.open(QFile::ReadOnly)) {
        formWidget = loader.load(&file, this);
        file.close();

        ui_newNameLine = qFindChild<QLineEdit*>(this, "nameIns");

        QMetaObject::connectSlotsByName(this);
        formWidget->show();
    }
}
У меня таким образом все заработало нормально. До модификаций возникала та же самая проблема.
И еще. formWidget->show() можно и не делать раз вы его сразу скрываете после создания класса.

P.S. Взаимодействие сигнал-слот не проверял.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.4.2009, 10:34
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 8.4.2009, 14:23) *
Поэтому данный класс должен наследоваться от QDialog, а не от QWidget.
не обязан, у меня есть много диалоговых окон наследников QWidget, потому-что мне ненужна функциональность QDialog. И ни каких проблем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 8.4.2009, 10:39
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Отлично! Заработало и у меня. Большое спасибо!)

Цитата(igor_bogomolov @ 8.4.2009, 11:23) *
newNameDlg это же диалоговае окно, я правильно понимаю, а не виджет на форме MainWindow?


Была необходимость в простом диалоговом окне, но получилось непойми что. Я у QDesigner'e состряпал форму и выставил в ней свойства изходя из своего представления. Ну и пример какой-то посмотрел. По мне, так окошко, которое по show() и hide() работает, является виджетом. А диалоговое окно создается в процедуре и doModal() какое-нибудь делает или exec().

Цитата(Litkevich Yuriy @ 8.4.2009, 11:34) *
не обязан, у меня есть много диалоговых окон наследников QWidget, потому-что мне ненужна функциональность QDialog. И ни каких проблем.


Но баг ушел тем не менее при замене QWidget -> QDialog...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 8.4.2009, 10:44
Сообщение #5


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy @ 8.4.2009, 11:34) *
не обязан, у меня есть много диалоговых окон наследников QWidget, потому-что мне ненужна функциональность QDialog. И ни каких проблем.

Ладно, может и не должен. Тогда скажите как правильно. Я до того ниразу динамические диалоговые окна не делал. А то Вы часто меня критикуете, а причин не объясняете, в чем именно я не прав. :rolleyes:

Тем не менее если наследоваться от QWidget, у меня возникают те же самые продлемы что и у NordWest. При наследовании от QDialog этих проблем не возникает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.4.2009, 11:03
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 8.4.2009, 14:44) *
Тем не менее если наследоваться от QWidget, у меня возникают те же самые продлемы что и у NordWest. При наследовании от QDialog этих проблем не возникает.
надо с остальным кодом разбираться

Цитата(igor_bogomolov @ 8.4.2009, 14:44) *
Я до того ниразу динамические диалоговые окна не делал.
такое поведение пунктов меню не должно быть связано с тем динамическое-ли окно или нет. Если же это так, то путь один - в трекер к тролям.

NordWest, а ты можешь простейший компилируемы проект сделать (минимальных рамеров), в котором такое поведение проявляется. И выложить сюда?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 8.4.2009, 11:26
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Litkevich Yuriy @ 8.4.2009, 12:00) *
надо с остальным кодом разбираться

Да нету никакого другого кода. Есть чистый проект. В disigner создан QMainWindow и меню. Есть файл ui. Форма из ui файла динамически загружается, как описано выше. Вот и весь код. :rolleyes:

Цитата(Litkevich Yuriy @ 8.4.2009, 12:03) *
а ты можешь простейший компилируемы проект сделать (минимальных рамеров), в котором такое поведение проявляется. И выложить сюда?

Впринципе и я могу. Выложить?

Вот тестовый проект. Если поменять QWidget на QDialog все станет нормально.
Прикрепленные файлы
Прикрепленный файл  menuBug.zip ( 2.81 килобайт ) Кол-во скачиваний: 117
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.4.2009, 11:43
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


igor_bogomolov, просто любопытно пощупать, а времени самому набрасывать проект нету. Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 8.4.2009, 11:49
Сообщение #9


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Да незачто. Самому ведь интерестно. Если бага, то только рад буду что нашли. :)
Юрий, еще к вам просьба. Когда ко мне лично обращаетесь, можно и по имени, я его не скрываю :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.4.2009, 11:52
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 8.4.2009, 15:49) *
Юрий, еще к вам просьба.
ко мне лучше на ты (с маленькой буквы).

Цитата(igor_bogomolov @ 8.4.2009, 15:49) *
Когда ко мне лично обращаетесь, можно и по имени, я его не скрываю
я ленивый, мне мышкой в ник ткнуть проще :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 19:18