QT combox选中状态问题

为什么QT的combox 选中之后退出界面不是上次选中的状态啊?该怎么写才能达到选中退出界面后再进入时是上次的选中状态啊,求解答

由于程序没有保存上一次下拉框的选项导致的。
使用QSettings类来保存每次下拉框的选项,以便下次重新打开程序时可以恢复之前的选项,示例代码:

// 保存
void MyWidget::saveSettings()
{
    QSettings settings("myApp", "myWidget");
    settings.setValue("comboboxIndex", ui->comboBox->currentIndex());
}

// 加载
void MyWidget::loadSettings()
{
    QSettings settings("myApp", "myWidget");
    int index = settings.value("comboboxIndex", 0).toInt();
    ui->comboBox->setCurrentIndex(index);
}

2、在析构函数中手动保存选项并在构造函数中加载上一次保存的选项。示例代码:

// 构造函数
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    // ...
    loadSettings();
}

// 析构函数
MyWidget::~MyWidget()
{
    saveSettings();
}

// 保存
void MyWidget::saveSettings()
{
    QSettings settings("myApp", "myWidget");
    settings.setValue("comboboxIndex", ui->comboBox->currentIndex());
}

// 加载
void MyWidget::loadSettings()
{
    QSettings settings("myApp", "myWidget");
    int index = settings.value("comboboxIndex", 0).toInt();
    ui->comboBox->setCurrentIndex(index);
}

在Qt中,QComboBox默认情况下是不会记住上一次选中的状态的,每次重新进入界面都会回到默认状态。如果需要记住上一次选中的状态,可以使用QSettings类进行设置。

QSettings类是Qt提供的用于读写应用程序设置的类,可以将应用程序的设置保存到系统的注册表、INI文件、XML文件等位置。在使用QSettings类时,需要指定一个组织名和应用程序名,这样可以保证不同应用程序之间的设置不会冲突。

下面是一个使用QSettings类实现记住QComboBox选中状态的示例代码:

#include <QComboBox>
#include <QSettings>

// 保存选中状态
void saveComboBoxState(QComboBox *comboBox, const QString &groupName, const QString &keyName)
{
    QSettings settings(QSettings::IniFormat, QSettings::UserScope, "MyCompany", "MyApp");
    settings.beginGroup(groupName);
    settings.setValue(keyName, comboBox->currentIndex());
    settings.endGroup();
}

// 加载选中状态
void loadComboBoxState(QComboBox *comboBox, const QString &groupName, const QString &keyName)
{
    QSettings settings(QSettings::IniFormat, QSettings::UserScope, "MyCompany", "MyApp");
    settings.beginGroup(groupName);
    int index = settings.value(keyName, 0).toInt();
    comboBox->setCurrentIndex(index);
    settings.endGroup();
}

// 在ComboBox的currentIndexChanged信号中调用saveComboBoxState保存状态
connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(saveComboBoxState(int)));

// 在ComboBox的构造函数中调用loadComboBoxState加载状态
comboBox->addItem("Option 1");
comboBox->addItem("Option 2");
loadComboBoxState(comboBox, "Settings", "SelectedIndex");

在上述代码中,使用QSettings类将选中状态保存到了名为"MyCompany"的组织下的"MyApp"应用程序的设置中。在保存和加载状态时,需要指定组名和键名,这样可以保证不同的设置之间不会冲突。在ComboBox的currentIndexChanged信号中,调用saveComboBoxState保存状态;在ComboBox的构造函数中,调用loadComboBoxState加载状态。这样就可以实现记住上一次选中状态的功能了。

需要注意的是,QSettings类保存的设置是与操作系统和用户相关的,不同的用户和操作系统可能会保存不同的设置。因此,在使用QSettings类时,需要指定适当的组织名和应用程序名,以保证不同的应用程序之间的设置不会冲突。

  • 这篇博客: QT-ComboBox中的 三、常用函数解释 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 添加数据(带图片)

    源码

    // 添加图片
    QIcon icon("F:/qiangu/qtnull/Null/ICON/icon.jpg");
    ui->comboBox->addItem(icon, QString("First"));
    ui->comboBox->addItem(icon, QString("Second"));
    ui->comboBox->addItem(icon, QString("Third"));
    ui->comboBox->addItem(icon, QString("Four"));
    
    // 批量添加
    QStringList strList;
    ui->comboBox->addItems(strList);

    允许编辑、不可编辑、文字居中(下拉框和按钮文字)

    源码

    QLineEdit *lineEdit = new QLineEdit();
    lineEdit->setReadOnly(true);  //仅查看
    //lineEdit->setEnabled(true); //可编辑
    lineEdit->setAlignment(Qt::AlignCenter);
    ui->comboBox->setLineEdit(lineEdit);
    
    for (int i = 0; i < ui->comboBox->count(); ++i) 
    {
    	ui->comboBox->setItemData(i, Qt::AlignCenter, Qt::TextAlignmentRole);
    }

    绑定View

    QComboBox的Item设置属性后,需要绑定View去实现(比如Item的高度修改)

    源码

    QListView *ListView = new QListView();
    ui->comboBox->setView(ListView);
    ui->comboBox->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);

    实时刷新QComboBox数据

    源码

    /// \brief 重写showPopup(),每次显示时,更新QComboBox的item数据
    void NullComboBox::showPopup()
    {
        QStringList listData;
        QComboBox::clear();
        QComboBox::addItems(listData);
        QComboBox::showPopup();
    }

    改变下拉列表位置

    源码

    void NullComboBox::showPopup()
    {
        QComboBox::showPopup();
        QWidget *popup = this->findChild<QFrame*>();
        //向下移动
        popup->move(popup->x(), popup->y() + 4);
        //向上弹出
        //popup->move(popup->x(), popup->y()-this->height()-popup->height());
    }

1.关闭对话框界面返回主界面后,重新打开你对话框界面,使用指针的方式实例化对话框,通过show和hide实现对话框的关闭和打开,不需要每次实例化一个新的对象,则两次操作的就是同一个对话框。
2.关闭对话框界面返回主界面后,重新打开你对话框界面,使用构造函数输出参数初始化界面


3.退出程序后重新打开,将界面设置记录到配置文件里,下次打开时加载配置文件