2013-12-14 2 views
1

Прежде всего позвольте мне сказать, что я новичок в QTCreator. У меня есть настройка пользовательского интерфейса для всего следующего, просто не могу понять, как правильно подключить сигналы и слоты:QT: Как повысить/понизить значение метки в зависимости от значения SpinBox

Хорошо, вот моя проблема. У меня есть 5 SpinBoxes с максимальным значением 10 и минимальным значением 0, все из которых начинаются с 0. У меня есть метка со значением 25. Когда я изменяю значение spinbox с помощью кнопок +/-, я хочу, чтобы метка вычитала или добавила обратно метку 25. Кроме того, как только значение 25 достигнет значения 0 Я хочу, чтобы все spinboxes были отключены для добавления.

(К сожалению, так как я установил все это вверх, используя форму создателю, весь код по умолчанию

. Пример:

Label: 1 
SB1: 5 
SB2: 10 
SB3: 2 
SB4: 6 
SB5: 1 

Все значения SpinBoxes равным 24. При нажатии кнопки плюс Если вы хотите, чтобы все кнопки + были отключены, и когда нажата кнопка, я хочу, чтобы она была включена.

+0

Ознакомьтесь с механизмом [сигналов/слотов] (https://qt-project.org/doc/qt-4.8/signalsandslots.html). –

+0

См. .. Я сделал это, и я понял: '(obj1, SIGNAL (valueChanged (int)), obj2, SLOT (setNum (int)))' он меняет метку на точное число спинбокса – SilverWolfe

+0

Вы можете ' t делать это непосредственно в дизайнере, нужен промежуточный пользовательский слот (определенный в C++), связанный с valueChnaged(), принимая, что принимает int из spinbox и вызывает label-> setNum (значение + 1) –

ответ

5

Вот код, предполагающий, что у вас есть класс формы с меткой и 5 спинбокс.

Заголовок:

class MainWindow : public QMainWindow { 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
    double sum; 
    QList<QSpinBox*> spinboxes; 

private slots: 
    void spinbox_value_changed(); 

}; 

Источник:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    sum = 25; 
    ui->setupUi(this); 
    spinboxes << ui->spinBox_1 << ui->spinBox_2 << ui->spinBox_3 
      << ui->spinBox_4 << ui->spinBox_5; 
    foreach(QSpinBox* spinbox, spinboxes) { 
    connect(spinbox, SIGNAL(valueChanged(int)), 
      this, SLOT(spinbox_value_changed())); 
    spinbox->setRange(0, sum); 
    } 
    spinbox_value_changed(); 
} 

MainWindow::~MainWindow() { 
    delete ui; 
} 

void MainWindow::spinbox_value_changed() { 
    double current_sum = 0; 
    foreach(QSpinBox* spinbox, spinboxes) { 
    current_sum += spinbox->value(); 
    } 
    double points_left = sum - current_sum; 
    if (points_left < 0) { 
    foreach(QSpinBox* spinbox, spinboxes) { 
     spinbox->setValue(0); 
    } 
    return; 
    } 
    foreach(QSpinBox* spinbox, spinboxes) { 
    if (points_left == 0) { 
     spinbox->setMaximum(spinbox->value()); 
    } else { 
     spinbox->setMaximum(sum); 
    } 
    } 
    ui->label->setText(QString().setNum(points_left)); 
} 

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

+0

также есть _a много примеров, которые в комплекте с qtcreator. – user2485710

+0

@Pavel_Strakhov Это сработало! Я благодарю вас! Я не думаю, что я бы подумал об этом методе ... Это показывает, что мне все еще нужно учиться, когда дело доходит до программирования. Еще раз спасибо! – SilverWolfe