0

私はC++を初めて使用し、プログラムに埋め込むことができるより優れたターミナルウィジェットを利用するために、元々 python/QtであったプログラムをC++/Qt に移植し始めたところです。今、私は少し立ち往生しています。ドロップダウンボックスから別の項目が選択された場合、currentIndex()それに応じてタブウィジェットのが変更されるように設定しようとしています。

これまでの私のコードは次のとおりです。

    //main.cpp

    #include <QApplication>
    #include "mainwindow.h"

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();

        return a.exec();
    }

ここにmainwindow.hがあります

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QTimer>


    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        QTimer *timer;
        void startMyTimer()
        {
            timer = new QTimer();
            timer->setInterval(1);
            timer->start();
            QObject::connect(timer,SIGNAL(timeout()),this,SLOT(changeIndex()));
        }

    private:
        Ui::MainWindow *ui;
        void changeIndex();
         };

    #endif // MAINWINDOW_H

そして最後にここにmainwindow.cppがあります

    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        changeIndex();
    }

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

    void MainWindow::changeIndex()
    {
        if (ui->comboBox->currentText() == "add-apt-repository")
        {
            ui->stackedWidget->setCurrentIndex(0);
            ui->checkBox->setCheckState(Qt::Checked);
        }
        if (ui->comboBox->currentText() == "apt-get")
        {
            ui->stackedWidget->setCurrentIndex(1);
            ui->checkBox->setCheckState(Qt::Checked);
        }
        if (ui->comboBox->currentText() == "aptitude")
        {
           ui->stackedWidget->setCurrentIndex(2);
           ui->checkBox->setCheckState(Qt::Checked);
        }
        if (ui->comboBox->currentText() == "bzr")
        {
            ui->stackedWidget->setCurrentIndex(3);
            ui->checkBox->setCheckState(Qt::Unchecked);
        }
        if (ui->comboBox->currentText() == "cd")
        {
            ui->stackedWidget->setCurrentIndex(4);
            ui->checkBox->setCheckState(Qt::Unchecked);
        }
        if (ui->comboBox->currentText() == "chmod")
        {
            ui->stackedWidget->setCurrentIndex(5);
            ui->checkBox->setCheckState(Qt::Checked);
        }
    }

QTimerの例をたくさん見てきましたが、途方に暮れています。私もやってif (ui->comboBox->changeEvent())みましたが、おそらくそれも間違って使っていたのでしょう。

4

2 に答える 2

1

タイマーを落として、ここでは役に立たない。代わりに、changeIndex() を「プライベート スロット:」セクションに入れてスロットにします。

public slots:
    void changeIndex();

次に、MainWindow コンストラクターで、コンボボックスのcurrentIndexChanged シグナルをスロットに接続します。

connect( ui->combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(changeIndex()) );
于 2013-01-29T17:58:09.213 に答える
1

まず、おそらく次のchangeIndex()ようにスロットとしてマークする必要があります。

class MainWindow : public QMainWindow
{
    Q_OBJECT

    // ...

    private slots: 
        void changeIndex();

    private:
        Ui::MainWindow *ui;
}

これには、Qt メタ オブジェクト コンパイラを呼び出す必要もあります。qmake を使用している場合、それはすでに完了しています。それ以外の場合は、ビルド システムによって異なります。

次に、タイマーを使用する特別な理由はありますか? コンボ ボックスのcurrentIndexChanged信号の 1 つに接続することもできます。

于 2013-01-29T18:01:27.737 に答える