A
This commit is contained in:
jussi 2018-12-22 19:11:45 +02:00
parent 45ac973040
commit 68072b25d4
3 changed files with 219 additions and 322 deletions

View File

@ -26,8 +26,8 @@ MainWindow::MainWindow(QWidget *parent) :
ui->memClkSlider->setRange(defMemClk + minMemClkOfsInt, defMemClk + maxMemClkOfsInt); ui->memClkSlider->setRange(defMemClk + minMemClkOfsInt, defMemClk + maxMemClkOfsInt);
ui->memClkSpinBox->setRange(defMemClk + minMemClkOfsInt, defMemClk + maxMemClkOfsInt); ui->memClkSpinBox->setRange(defMemClk + minMemClkOfsInt, defMemClk + maxMemClkOfsInt);
ui->memClkSlider->setValue(curMaxMemClkInt); ui->memClkSlider->setValue(defMemClk + memClkOfsInt);
ui->memClkSpinBox->setValue(curMaxMemClkInt); ui->memClkSpinBox->setValue(defMemClk + memClkOfsInt);
ui->voltageSlider->setRange(voltInt + minVoltOfsInt, voltInt + maxVoltOfsInt); ui->voltageSlider->setRange(voltInt + minVoltOfsInt, voltInt + maxVoltOfsInt);
ui->voltageSpinBox->setRange(voltInt + minVoltOfsInt, voltInt + maxVoltOfsInt); ui->voltageSpinBox->setRange(voltInt + minVoltOfsInt, voltInt + maxVoltOfsInt);
@ -41,8 +41,13 @@ MainWindow::MainWindow(QWidget *parent) :
QTimer *fanUpdateTimer = new QTimer(this); QTimer *fanUpdateTimer = new QTimer(this);
connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(fanSpeedUpdater())); connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(fanSpeedUpdater()));
connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(tempUpdater())); //connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(tempUpdater()));
fanUpdateTimer->start(2000); fanUpdateTimer->start(2000);
connect(ui->frequencySpinBox, SIGNAL(valueChanged(int)), SLOT(resetTimer()));
connect(ui->powerLimSpinBox, SIGNAL(valueChanged(int)), SLOT(resetTimer()));
connect(ui->memClkSpinBox, SIGNAL(valueChanged(int)), SLOT(resetTimer()));
connect(ui->voltageSpinBox, SIGNAL(valueChanged(int)), SLOT(resetTimer()));
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -162,22 +167,44 @@ void MainWindow::tempUpdater()
generateFanPoint(); generateFanPoint();
} }
} }
void MainWindow::resetTimer()
{
// If a value has been changed this timer will start. When the apply button has been pressed, this gets cancelled
connect(resettimer, SIGNAL(timeout()), SLOT(resetChanges()));
resettimer->stop();
resettimer->setSingleShot(true);
resettimer->start(10000);
}
void MainWindow::resetChanges()
{
// If the settings haven't been applied in 10 seconds, reset all values to their latest values
ui->frequencySlider->setValue(defCoreClk + latestClkOfs);
ui->frequencySpinBox->setValue(defCoreClk + latestClkOfs);
ui->powerLimSlider->setValue(latestPowerLim);
ui->powerLimSpinBox->setValue(latestPowerLim);
ui->voltageSlider->setValue(voltInt + latestVoltOfs);
ui->voltageSpinBox->setValue(voltInt + latestVoltOfs);
ui->memClkSlider->setValue(curMaxMemClkInt);
ui->memClkSpinBox->setValue(curMaxMemClkInt);
ui->memClkSlider->setValue(defMemClk + latestMemClkOfs);
ui->memClkSpinBox->setValue(defMemClk + latestMemClkOfs);
qDebug() << "timer";
}
void MainWindow::queryGPUSettings() void MainWindow::queryGPUSettings()
{ {
QString volt;
QProcess process; QProcess process;
process.start(nvVoltQ); process.start(nvVoltQ);
process.waitForFinished(-1); process.waitForFinished(-1);
volt = process.readLine(); voltInt = process.readLine().toInt()/1000;
volt.chop(1);
voltInt = volt.toInt()/1000;
QString voltOfs;
process.start(nvVoltOfsQ); process.start(nvVoltOfsQ);
process.waitForFinished(-1); process.waitForFinished(-1);
voltOfs = process.readLine(); voltOfsInt = process.readLine().toInt()/1000;
voltOfs.chop(1); latestVoltOfs = voltOfsInt;
voltOfsInt = voltOfs.toInt()/1000;
defVolt = voltInt - voltOfsInt; defVolt = voltInt - voltOfsInt;
@ -197,56 +224,26 @@ void MainWindow::queryGPUSettings()
coreFreqOfs = process.readLine(); coreFreqOfs = process.readLine();
coreFreqOfs.chop(1); coreFreqOfs.chop(1);
coreFreqOfsInt = coreFreqOfs.toInt(); coreFreqOfsInt = coreFreqOfs.toInt();
latestClkOfs = coreFreqOfsInt;
QString curMaxClk;
process.start(nvCurMaxClkQ); process.start(nvCurMaxClkQ);
process.waitForFinished(-1); process.waitForFinished(-1);
curMaxClkInt = process.readLine().toInt(); curMaxClkInt = process.readLine().toInt();
qDebug() << curMaxClkInt; qDebug() << curMaxClkInt;
QString maxPowerLim;
process.start(nvMaxPowerLimQ); process.start(nvMaxPowerLimQ);
process.waitForFinished(-1); process.waitForFinished(-1);
for (int i=0; i<process.size(); i++) { maxPowerLimInt = process.readLine().toInt();
QString output = process.readLine();
if (!output.contains("power")) {
maxPowerLim = output;
break;
}
}
maxPowerLim.chop(3);
maxPowerLimInt = maxPowerLim.toDouble();
qDebug() << maxPowerLimInt;
QString minPowerLim;
process.start(nvMinPowerLimQ); process.start(nvMinPowerLimQ);
process.waitForFinished(-1); process.waitForFinished(-1);
for (int i=0; i<process.size(); i++) { minPowerLimInt = process.readLine().toInt();
QString output = process.readLine();
if (!output.contains("power")) {
minPowerLim = output;
break;
}
}
minPowerLim.chop(3);
minPowerLimInt = minPowerLim.toDouble();
qDebug() << minPowerLimInt;
QString curPowerLim;
process.start(nvCurPowerLimQ); process.start(nvCurPowerLimQ);
process.waitForFinished(-1); process.waitForFinished(-1);
for (int i=0; i<process.size(); i++) { curPowerLimInt = process.readLine().toInt();
QString output = process.readLine(); latestPowerLim = curPowerLimInt;
if (!output.contains("power")) {
curPowerLim = output;
break;
}
}
curPowerLim.chop(3);
curPowerLimInt = curPowerLim.toDouble();
qDebug() << curPowerLimInt;
QString clockLimits;
process.start(nvClockLimQ); process.start(nvClockLimQ);
process.waitForFinished(-1); process.waitForFinished(-1);
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
@ -270,22 +267,15 @@ void MainWindow::queryGPUSettings()
maxMemClkOfsInt = line.toInt()/2; maxMemClkOfsInt = line.toInt()/2;
} }
} }
qDebug() << minMemClkOfsInt << maxMemClkOfsInt;
process.start(nvCurMaxMemClkQ); process.start(nvCurMaxMemClkQ);
process.waitForFinished(-1); process.waitForFinished(-1);
curMaxMemClkInt = process.readLine().toInt(); curMaxMemClkInt = process.readLine().toInt();
qDebug() << curMaxMemClkInt;
process.start(nvCurMemClkOfsQ); process.start(nvCurMemClkOfsQ);
process.waitForFinished(-1); process.waitForFinished(-1);
memClkOfsInt = process.readLine().toInt()/2; memClkOfsInt = process.readLine().toInt()/2;
qDebug() << memClkOfsInt; latestMemClkOfs = memClkOfsInt;
process.start(nvFanQ);
process.waitForFinished(-1);
fanSpeed = process.readLine().toInt();
qDebug() << fanSpeed;
// Since the maximum core clock reported is the same on negative offsets as on 0 offset add a check here // Since the maximum core clock reported is the same on negative offsets as on 0 offset add a check here
if (0 >= coreFreqOfsInt) { if (0 >= coreFreqOfsInt) {
@ -298,40 +288,56 @@ void MainWindow::queryGPUSettings()
void MainWindow::applyGPUSettings() void MainWindow::applyGPUSettings()
{ {
QProcess process; QProcess process;
int offsetValue = ui->frequencySlider->value() - defCoreClk; int offsetValue;
int powerLimit;
QString input = nvCoreClkSet; QString input = nvCoreClkSet;
input.append(QString::number(offsetValue)); if (latestClkOfs != ui->frequencySlider->value() - defCoreClk) {
qDebug() << input; offsetValue = ui->frequencySlider->value() - defCoreClk;
process.start(input); QString input = nvCoreClkSet;
process.waitForFinished(-1); input.append(QString::number(offsetValue));
qDebug() << input;
offsetValue = ui->memClkSlider->value() - defMemClk;
input = nvMemClkSet;
input.append(QString::number(offsetValue*2));
qDebug() << input;
process.start(input);
process.waitForFinished(-1);
int powerLimit = ui->powerLimSlider->value();
input = nvPowerLimSet;
if (!isRoot) {
input.append(QString::number(powerLimit) +"'\"");
input.prepend("/bin/sh -c \"kdesu -c ");
process.start(input); process.start(input);
process.waitForFinished(-1); process.waitForFinished(-1);
} else { latestClkOfs = ui->frequencySlider->value() - defCoreClk;
input.append(QString::number(powerLimit));
process.start(input);
process.waitForFinished(-1);
qDebug() << "ran as root";
} }
offsetValue = ui->voltageSlider->value() - defVolt; if (latestMemClkOfs != ui->memClkSlider->value() - defMemClk) {
input = nvVoltageSet; offsetValue = ui->memClkSlider->value() - defMemClk;
input.append(QString::number(offsetValue*1000)); input = nvMemClkSet;
qDebug() << input; input.append(QString::number(offsetValue*2));
process.start(input); qDebug() << input;
process.waitForFinished(-1); process.start(input);
process.waitForFinished(-1);
latestMemClkOfs = ui->memClkSlider->value() - defMemClk;
}
if (latestPowerLim != ui->powerLimSlider->value()) {
powerLimit = ui->powerLimSlider->value();
input = nvPowerLimSet;
if (!isRoot) {
input.append(QString::number(powerLimit) +"'\"");
input.prepend("/bin/sh -c \"kdesu -c ");
process.start(input);
process.waitForFinished(-1);
} else {
input.append(QString::number(powerLimit));
process.start(input);
process.waitForFinished(-1);
qDebug() << "ran as root";
}
latestPowerLim = ui->powerLimSlider->value();
}
if (latestVoltOfs != ui->voltageSlider->value() - defVolt) {
offsetValue = ui->voltageSlider->value() - defVolt;
input = nvVoltageSet;
input.append(QString::number(offsetValue*1000));
qDebug() << input;
process.start(input);
process.waitForFinished(-1);
latestVoltOfs = ui->voltageSlider->value() - defVolt;
}
resettimer->stop();
} }
void MainWindow::loadProfileSettings() void MainWindow::loadProfileSettings()
{ {
@ -380,8 +386,8 @@ void MainWindow::on_newProfile_closed()
} }
void MainWindow::saveProfileSettings() void MainWindow::saveProfileSettings()
{ {
QSettings settings; QSettings settings("nvfancurve");
settings.beginGroup(currentProfile);
} }

View File

@ -20,20 +20,20 @@ public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
QString currentProfile; QString currentProfile;
QString nvFanQ = "nvidia-settings -q GPUCurrentFanSpeed -t"; QString nvFanQ = "/bin/sh -c \"nvidia-smi --query-gpu=fan.speed --format=csv | egrep -o '[1-9]{1,4}'\"";
QString nvVoltQ = "nvidia-settings -q GPUCurrentCoreVoltage -t"; QString nvVoltQ = "nvidia-settings -q GPUCurrentCoreVoltage -t";
QString nvVoltOfsQ = "nvidia-settings -q GPUOverVoltageOffset -t"; QString nvVoltOfsQ = "nvidia-settings -q GPUOverVoltageOffset -t";
QString nvVoltOfsLimQ = "/bin/sh -c \"nvidia-settings -a GPUOverVoltageOffset=99999999 | egrep -o '[0-9]{1,9}'\""; QString nvVoltOfsLimQ = "/bin/sh -c \"nvidia-settings -a GPUOverVoltageOffset=99999999 | egrep -o '[0-9]{1,9}'\"";
QString nvCoreClkOfsQ = "nvidia-settings -q GPUGraphicsClockOffset[3] -t"; QString nvCoreClkOfsQ = "nvidia-settings -q GPUGraphicsClockOffset[3] -t";
QString nvCurMaxClkQ = "/bin/sh -c \"nvidia-smi --query-supported-clocks=gr --format=csv | egrep -o '[0-9]{2,9}'\""; QString nvCurMaxClkQ = "/bin/sh -c \"nvidia-smi --query-supported-clocks=gr --format=csv | egrep -o '[0-9]{2,9}'\"";
QString nvMaxPowerLimQ = "nvidia-smi --query-gpu=power.max_limit --format=csv"; QString nvMaxPowerLimQ = "/bin/sh -c \"nvidia-smi --query-gpu=power.max_limit --format=csv | egrep -o '[0-9]{1,7}'\"";
QString nvMinPowerLimQ = "nvidia-smi --query-gpu=power.min_limit --format=csv"; QString nvMinPowerLimQ = "/bin/sh -c \"nvidia-smi --query-gpu=power.min_limit --format=csv | egrep -o '[0-9]{1,7}'\"";
QString nvCurPowerLimQ = "nvidia-smi --query-gpu=power.limit --format=csv"; QString nvCurPowerLimQ = "/bin/sh -c \"nvidia-smi --query-gpu=power.limit --format=csv | egrep -o '[0-9]{1,7}'\"";
QString nvClockLimQ = "/bin/sh -c \"nvidia-settings -a GPUGraphicsClockOffset[3]=999999 | egrep -o '[-0-9]{2,9}'\""; QString nvClockLimQ = "/bin/sh -c \"nvidia-settings -a GPUGraphicsClockOffset[3]=999999 | egrep -o '[-0-9]{2,9}'\"";
QString nvMemClkLimQ = "/bin/sh -c \"nvidia-settings -a GPUMemoryTransferRateOffset[3]=999999 | egrep -o '[-0-9]{2,9}'\""; QString nvMemClkLimQ = "/bin/sh -c \"nvidia-settings -a GPUMemoryTransferRateOffset[3]=999999 | egrep -o '[-0-9]{2,9}'\"";
QString nvCurMaxMemClkQ = "/bin/sh -c \"nvidia-smi --query-supported-clocks=mem --format=csv | egrep -o '[0-9]{2,9}'\""; QString nvCurMaxMemClkQ = "/bin/sh -c \"nvidia-smi --query-supported-clocks=mem --format=csv | egrep -o '[0-9]{2,9}'\"";
QString nvCurMemClkOfsQ = "nvidia-settings -q GPUMemoryTransferRateOffset[3] -t"; QString nvCurMemClkOfsQ = "nvidia-settings -q GPUMemoryTransferRateOffset[3] -t";
QString nvTempQ = "nvidia-settings -q ThermalSensorReading -t"; QString nvTempQ = "/bin/sh -c \"nvidia-smi --query-gpu=temperature.gpu --format=csv | egrep -o '[1-9]{1,4}'\"";
QString nvCoreClkSet = "nvidia-settings -a GPUGraphicsClockOffset[3]="; QString nvCoreClkSet = "nvidia-settings -a GPUGraphicsClockOffset[3]=";
QString nvMemClkSet = "nvidia-settings -a GPUMemoryTransferRateOffset[3]="; QString nvMemClkSet = "nvidia-settings -a GPUMemoryTransferRateOffset[3]=";
@ -73,6 +73,11 @@ public:
int defMemClk; int defMemClk;
int defVolt; int defVolt;
int latestClkOfs;
int latestPowerLim;
int latestMemClkOfs;
int latestVoltOfs;
bool isRoot; bool isRoot;
public slots: public slots:
void saveProfileSettings(); void saveProfileSettings();
@ -117,10 +122,14 @@ private slots:
void checkForRoot(); void checkForRoot();
void tempUpdater(); void tempUpdater();
void enableFanControl(); void enableFanControl();
void resetChanges();
void resetTimer();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
bool noProfiles = true; bool noProfiles = true;
QVector <int> compXPoints, compYPoints; QVector <int> compXPoints, compYPoints;
QTimer *resettimer = new QTimer(this);
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -6,250 +6,132 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>513</width> <width>384</width>
<height>762</height> <height>590</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>MainWindow</string> <string>MainWindow</string>
</property> </property>
<widget class="QWidget" name="centralWidget"> <widget class="QWidget" name="centralWidget">
<widget class="QComboBox" name="profileComboBox"> <layout class="QGridLayout" name="gridLayout">
<property name="geometry"> <item row="0" column="0">
<rect> <widget class="QPushButton" name="pushButton">
<x>340</x> <property name="text">
<y>650</y> <string>testinappi</string>
<width>151</width> </property>
<height>31</height> </widget>
</rect> </item>
</property> <item row="1" column="0" colspan="2">
</widget> <widget class="QLabel" name="label">
<widget class="QPushButton" name="pushButton"> <property name="text">
<property name="geometry"> <string>Fan Speed (%)</string>
<rect> </property>
<x>10</x> </widget>
<y>10</y> </item>
<width>75</width> <item row="2" column="0" colspan="3">
<height>23</height> <widget class="QSlider" name="fanSlider">
</rect> <property name="orientation">
</property> <enum>Qt::Horizontal</enum>
<property name="text"> </property>
<string>testinappi</string> </widget>
</property> </item>
</widget> <item row="2" column="3">
<widget class="QSlider" name="frequencySlider"> <widget class="QSpinBox" name="fanSpinBox"/>
<property name="geometry"> </item>
<rect> <item row="3" column="0" colspan="2">
<x>70</x> <widget class="QLabel" name="voltgeLabel">
<y>560</y> <property name="text">
<width>271</width> <string>Voltage (mV)</string>
<height>20</height> </property>
</rect> </widget>
</property> </item>
<property name="orientation"> <item row="4" column="0" colspan="3">
<enum>Qt::Horizontal</enum> <widget class="QSlider" name="voltageSlider">
</property> <property name="orientation">
</widget> <enum>Qt::Horizontal</enum>
<widget class="QSpinBox" name="frequencySpinBox"> </property>
<property name="geometry"> </widget>
<rect> </item>
<x>350</x> <item row="4" column="3">
<y>560</y> <widget class="QSpinBox" name="voltageSpinBox"/>
<width>71</width> </item>
<height>21</height> <item row="5" column="0" colspan="2">
</rect> <widget class="QLabel" name="memClockLabel">
</property> <property name="text">
</widget> <string>Memory Clock (MHz)</string>
<widget class="QPushButton" name="newProfile"> </property>
<property name="geometry"> </widget>
<rect> </item>
<x>300</x> <item row="6" column="0" colspan="3">
<y>650</y> <widget class="QSlider" name="memClkSlider">
<width>31</width> <property name="orientation">
<height>31</height> <enum>Qt::Horizontal</enum>
</rect> </property>
</property> </widget>
<property name="text"> </item>
<string>...</string> <item row="6" column="3">
</property> <widget class="QSpinBox" name="memClkSpinBox"/>
</widget> </item>
<widget class="QSlider" name="powerLimSlider"> <item row="7" column="0" colspan="2">
<property name="geometry"> <widget class="QLabel" name="powerLimLabel">
<rect> <property name="text">
<x>70</x> <string>Power Limit (W)</string>
<y>501</y> </property>
<width>271</width> </widget>
<height>20</height> </item>
</rect> <item row="8" column="0" colspan="3">
</property> <widget class="QSlider" name="powerLimSlider">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
<widget class="QSpinBox" name="powerLimSpinBox"> </item>
<property name="geometry"> <item row="8" column="3">
<rect> <widget class="QSpinBox" name="powerLimSpinBox"/>
<x>350</x> </item>
<y>500</y> <item row="9" column="0" colspan="2">
<width>71</width> <widget class="QLabel" name="clockFreqLabel">
<height>21</height> <property name="text">
</rect> <string>Clock Frequency (MHz)</string>
</property> </property>
</widget> </widget>
<widget class="QSpinBox" name="memClkSpinBox"> </item>
<property name="geometry"> <item row="10" column="0" colspan="3">
<rect> <widget class="QSlider" name="frequencySlider">
<x>350</x> <property name="orientation">
<y>440</y> <enum>Qt::Horizontal</enum>
<width>71</width> </property>
<height>21</height> </widget>
</rect> </item>
</property> <item row="10" column="3">
</widget> <widget class="QSpinBox" name="frequencySpinBox"/>
<widget class="QSlider" name="memClkSlider"> </item>
<property name="geometry"> <item row="11" column="1">
<rect> <widget class="QPushButton" name="applyButton">
<x>70</x> <property name="text">
<y>440</y> <string>Apply changes</string>
<width>271</width> </property>
<height>20</height> </widget>
</rect> </item>
</property> <item row="11" column="2">
<property name="orientation"> <widget class="QPushButton" name="newProfile">
<enum>Qt::Horizontal</enum> <property name="text">
</property> <string>...</string>
</widget> </property>
<widget class="QSlider" name="voltageSlider"> </widget>
<property name="geometry"> </item>
<rect> <item row="11" column="3">
<x>70</x> <widget class="QComboBox" name="profileComboBox"/>
<y>381</y> </item>
<width>271</width> </layout>
<height>20</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSpinBox" name="voltageSpinBox">
<property name="geometry">
<rect>
<x>350</x>
<y>380</y>
<width>71</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="clockFreqLabel">
<property name="geometry">
<rect>
<x>70</x>
<y>530</y>
<width>191</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Clock Frequency (MHz)</string>
</property>
</widget>
<widget class="QLabel" name="powerLimLabel">
<property name="geometry">
<rect>
<x>70</x>
<y>470</y>
<width>141</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Power Limit (W)</string>
</property>
</widget>
<widget class="QLabel" name="memClockLabel">
<property name="geometry">
<rect>
<x>70</x>
<y>410</y>
<width>151</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Memory Clock (MHz)</string>
</property>
</widget>
<widget class="QLabel" name="voltgeLabel">
<property name="geometry">
<rect>
<x>70</x>
<y>350</y>
<width>141</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Voltage (mV)</string>
</property>
</widget>
<widget class="QSlider" name="fanSlider">
<property name="geometry">
<rect>
<x>70</x>
<y>320</y>
<width>271</width>
<height>20</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QSpinBox" name="fanSpinBox">
<property name="geometry">
<rect>
<x>351</x>
<y>319</y>
<width>71</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>70</x>
<y>290</y>
<width>131</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Fan Speed (%)</string>
</property>
</widget>
<widget class="QPushButton" name="applyButton">
<property name="geometry">
<rect>
<x>175</x>
<y>650</y>
<width>101</width>
<height>32</height>
</rect>
</property>
<property name="text">
<string>Apply changes</string>
</property>
</widget>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>513</width> <width>384</width>
<height>28</height> <height>28</height>
</rect> </rect>
</property> </property>