Виджеты Qt, похоже, перекрывают другие виджеты, когда они не должны - PullRequest
1 голос
/ 15 октября 2010

Я использовал setGeometry () для перемещения и изменения размера некоторых кнопок и списка в окне.Проблема в том, что кнопки и список имеют определенный порядок и странным образом пересекаются.Я даже не хочу, чтобы они перекрывались, и я не понимаю, почему они перекрываются с самого начала.

Поскольку они указаны в приведенном ниже коде, единственное, на что я могу нажать, это BtnPlay.Другая кнопка даже не меняется при наведении мыши.В зависимости от того, как я их позиционирую, все становится доступным для щелчка.

Был момент, когда сначала был создан виджет, самый дальний вправо, и виджет, созданный последним в начале координат.Все работало, что заставляет меня верить, что они перекрывают невидимую равнину, но я не понимаю, почему или как это исправить.Кроме того, когда я поместил кнопку рядом со списком (кнопка находилась в левой части списка), по какой-то причине в списке больше не было возможности щелкнуть мышью.Задать геометрию позволяет мне устанавливать верхние левые координаты, ширину и высоту виджета.Я не понимаю, почему они будут мешать друг другу.

 int Gui_Init(int argc, char *argv[])
 {
 QApplication app(argc, argv);
 app.setStyle("plastique");
 QWidget Window;
 Window.resize(800, 600);

 QTrackList = new QListObj(&Window);
 RebuildButton BtnRB(&Window);
 PlayButton BtnPlay(&Window);

 Window.show();
 return app.exec();
 return 0;
 }


 RebuildButton::RebuildButton(QWidget *parent) : QWidget(parent)
 {
 Rebuild = new QPushButton(tr("Rebuild Library"), this);
 Rebuild->setGeometry(400,575,100,25);
 connect(Rebuild, SIGNAL(clicked()), this, SLOT(RebuildLibrary()));
 }


 PlayButton::PlayButton(QWidget *parent) : QWidget(parent)
 {
 PlayBtn = new QPushButton(tr("Play Track"), this);
 PlayBtn->setGeometry(400, 550, 100, 25);
 connect(PlayBtn, SIGNAL(clicked()), this, SLOT(PlayTrack()));
 }

Конструктор для QListObj:

 QListObj::QListObj(QWidget *parent) : QWidget(parent)
 {
 List = new QListWidget(parent);
 List->setGeometry(500,0,300,600);
 new QListWidgetItem(tr("fix it"), List);
 connect(List, SIGNAL(itemSelectionChanged()), this, SLOT(SelectTrack()));
 }

1 Ответ

1 голос
/ 15 октября 2010

Ваш дизайн немного необычен, подклассы QWidget содержат кнопку, но я подозреваю, что ваша проблема может заключаться в том, что вы устанавливаете геометрию для кнопок относительно содержащихся подклассов QWidget (RebuildButton и * 1004) *) но не устанавливайте геометрию для самих виджетов RebuildButton и PlayButton.

Когда вы чувствуете себя более комфортно с тем, как все работает, вы можете немного изменить дизайн и попытаться отделить ваш графический интерфейс от бизнес-логики. Создайте подкласс QWidget, который будет действовать как окно вашего приложения (или используйте QMainWindow), и используйте комбинацию менеджеров компоновки для добавления / компоновки всех ваших графических элементов управления в конструкторе этого подкласса.

Я бы тогда предложил вам выполнить все ваши подключения сигналов кнопок к частным слотам в классе окна и из этих слотов излучать пользовательские сигналы, которые запускают бизнес-логику для выполнения в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...