#c #windows #qt #user-interface #cross-platform
#c #Windows #qt #пользовательский интерфейс #кросс-платформенный
Вопрос:
Я студент, работающий над своей первой программой Qt, и мне нужна некоторая помощь. Я разрабатываю симулятор музыкальных инструментов. У меня есть главное окно и 2 класса: DrumsWindow и KeysWindow, имитирующие барабаны и клавиши и имеющие разные размеры (барабаны 798×532, клавиши 953×306). Я создал TabWidget в главном окне и вставил в него свои DrumsWindow и KeysWindow:
ui->tabWidget->insertTab(0, amp;dw, "Drums");
ui->tabWidget->insertTab(1, amp;kw, "Synth");
if (ui->tabWidget->currentIndex() == 0){
this->resize(798, 532);
ui->tabWidget->resize(798, 532);
}
if (ui->tabWidget->currentIndex() == 1){
this->resize(953, 306);
ui->tabWidget->resize(953, 306);
}
Этот код взят из конструктора MainWindow. Это работает, в главном окне есть две вкладки, показывающие барабаны и клавиши. Однако эти утверждения «если» создают только первую открытую вкладку нужного размера. Когда я нажимаю на вкладку Synth, размер окна остается прежним (хотя мне нужно его изменить). Итак, это то, что я сделал, чтобы решить проблему. Сначала я создал новые слоты в классе MainWindow:
void MainWindow::drumsTabClicked()
{
ui->tabWidget->setCurrentIndex(0);
this->resize(798, 532);
ui->tabWidget->resize(798, 532);
}
void MainWindow::keysTabClicked()
{
ui->tabWidget->setCurrentIndex(1);
this->resize(953, 306);
ui->tabWidget->resize(953, 306);
}
А затем я подключил их к сигналам:
connect(ui->tabWidget, SIGNAL(tabBarClicked(0)), this, SLOT(drumsTabClicked()));
connect(ui->tabWidget, SIGNAL(tabBarClicked(1)), this, SLOT(keysTabClicked()));
Но все равно это не работает. Не могли бы вы, пожалуйста, объяснить, как изменить размер главного окна, когда пользователь нажимает на вкладку?
Комментарии:
1. connect(ui->TabWidget, SIGNAL(tabBarClicked(0)), this, SLOT(drumsTabClicked())); Это недопустимая инструкция connect. Пожалуйста, ознакомьтесь с информацией о сигналах и слотах .
2. Не по теме, но … явное определение размера виджетов почти всегда является неправильным решением. Если у вас нет веских причин поступать иначе, вы должны просто позволить макетам выполнять свою работу.
3. Вы используете стиль Qt4 для подключения сигналов. Это устарело и больше не рекомендуется. Начиная с Qt5, существует новый стиль, который оценивается во время компиляции (в отличие от оценки во время выполнения до Qt4). Кроме того, вам больше не нужны явно отмеченные слоты, но вы можете подключить каждый вызываемый объект с соответствующей подписью (включая лямбды). К вашему СВЕДЕНИЮ: новый синтаксис сигнального слота
4. Я согласен с @G.M. относительно изменения размера окна. Я могу себе представить, что у вас есть определенная идея, но попытка сделать это в Qt борется с ветряными мельницами. Вместо этого вы должны попытаться разместить макет в сетках (или блоках), где размеры ячеек сетки (автоматически) определяются во время выполнения самим Qt. Таким образом, вы только настраиваете, какие ячейки разрешено увеличивать (чтобы заполнить доступное дополнительное пространство), а какие нет. Наконец, вы (вероятно) поймете, что это упрощает компоновку и обслуживание. К вашему сведению: Управление макетом
5. Я понимаю, что «явное определение размеров виджетов почти всегда является неправильным», но моя программа представляет собой симулятор музыкального инструмента, в котором на каждой вкладке есть фотография инструмента. Размеры фотографий фиксированы, поэтому, чтобы сохранить их от обрезки, мне нужно изменить геометрию окна. И я не могу применить какой-либо макет, потому что мне нужно, чтобы каждая кнопка имела фиксированное положение на фотографии, соответствующее части инструмента, который она должна имитировать.
Ответ №1:
Вы должны подключить его следующим образом:
connect(ui->tabWidget, SIGNAL(tabBarClicked(int)), this, SLOT(onTabBarClicked(int)));
Затем сделайте свои вещи в этом слоте и разделите их с помощью if:
void MainWindow::tabBarClicked(int index)
{
if(!index)
{
this->resize(798, 532);
ui->tabWidget->resize(798, 532);
}
else
{
this->resize(953, 306);
ui->tabWidget->resize(953, 306);
}
}
Также вы можете создать это соединение автоматически, щелкнув правой кнопкой мыши на панели вкладок формы пользовательского интерфейса и выбрав перейти к слоту tabBarClicked.
Ответ №2:
Спасибо, ребята, вы мне очень помогли. Вот что я сделал.
mainwindow.h: добавлен слот
private slots:
void onTabBarClicked(int);
mainwindow.cpp : добавлена реализация слота
void MainWindow::onTabBarClicked(int index){
if (index == 0){
this->resize(798, 532);
ui->tabWidget->resize(798, 532);
}
if (index == 1){
this->resize(953, 306);
ui->tabWidget->resize(953, 306);
}
}
И подключил слот и сигнал, используя синтаксис Qt5:
connect(ui->tabWidget, amp;QTabWidget::tabBarClicked, this, amp;MainWindow::onTabBarClicked);
Итак, теперь это работает!