qt 多个选择一个功能实现

请问,怎样实现这个功能,当点击红框内任意位置,就会打印被点击的语言,并且打钩就会转移到被点击那一栏的后面,(想要信号与槽函数做,有其他方法也可以)
还有麻烦写出代码;

img


TechWhizKid参考GPT回答:

下面是一个基础的解决方案:

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>
#include <QVBoxLayout>
#include <QDebug>

class LanguageSelector : public QWidget {
public:
    LanguageSelector(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        listWidget = new QListWidget(this);
        layout->addWidget(listWidget);

        QListWidgetItem *item1 = new QListWidgetItem("简体中文                √", listWidget);
        QListWidgetItem *item2 = new QListWidgetItem("English", listWidget);

        // 默认选择第一项
        listWidget->setCurrentItem(item1);

        connect(listWidget, &QListWidget::itemClicked, this, &LanguageSelector::onItemClicked);
    }

private slots:
    void onItemClicked(QListWidgetItem *item) {
        qDebug() << "Language Selected:" << item->text();

        for (int i = 0; i < listWidget->count(); ++i) {
            QListWidgetItem *eachItem = listWidget->item(i);
            QString text = eachItem->text();
            text = text.remove("                √");
            eachItem->setText(text);
        }

        item->setText(item->text() + "                √");
    }

private:
    QListWidget *listWidget;
};

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    LanguageSelector w;
    w.show();
    return a.exec();
}
  • 以上代码创建了一个列表框,并在列表框中添加了两个列表项,一个为 "简体中文 √",另一个为 "English"。然后,将列表框的 itemClicked 信号连接到了一个槽函数上。当用户点击列表框中的任何项时,都会触发这个槽函数。
  • 在槽函数中,首先打印出被点击项的文本,然后清除所有列表项的 "√",并在被点击的列表项的文本后面添加 "√"。

这这个代码也假设 "√" 是用来表示当前选择的语言的,如果你要一个不同的表示方式,那么你可能需要修改这个代码。

打印被点击的语言?
你这个是什么控件

#include <QtWidgets>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr)
        : QMainWindow(parent)
    {
        QPushButton *button = new QPushButton("Click Me", this);
        QLabel *label = new QLabel(this);

        connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(button);
        layout->addWidget(label);

        QWidget *centralWidget = new QWidget(this);
        centralWidget->setLayout(layout);
        setCentralWidget(centralWidget);
    }

private slots:
    void onButtonClicked()
    {
        QPushButton *button = qobject_cast<QPushButton*>(sender());
        QString buttonText = button->text();
        qDebug() << buttonText;

        // 设置标签控件的图标为一个打勾的图标
        QPixmap pixmap(":/path/to/check_icon.png");
        label->setPixmap(pixmap);
    }

private:
    QLabel *label;
};

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

#include "main.moc"

图标路径(":/path/to/check_icon.png")需要替换为你实际使用的图标路径。

需求详细点,然后用什么语言实现

提供小小示例,示例中创建四个 QPushButton 控件,并将它们按照一定的布局排放到了一个 QMainWindow 窗口中。然后定义一个 Languages 类,该类继承自 QObject 类,它只有一个 printSelectedLanguage() 槽函数。这个槽函数用于打印当前选中的语言。在 printSelectedLanguage() 函数中,遍历所有 QPushButton 控件,找到当前被选中的控件,并调用它的 print() 函数打印它的文本。需要注意的是,在每个 QPushButton 控件被点击时,它的 isChecked() 函数会返回 true,因此可以通过遍历所有 QPushButton 控件来判断当前被选中的是哪个控件。

#include <QApplication>  
#include <QPushButton>  
#include <QObject>  
#include <QPrintDialog>  
  
class Languages : public QObject {  
    Q_OBJECT  
public:  
    Languages() : QObject() {  
        // 创建四个 QPushButton 控件并设置初始状态  
        englishBtn = new QPushButton("English", this);  
        frenchBtn = new QPushButton("French", this);  
        germanBtn = new QPushButton("German", this);  
        spanishBtn = new QPushButton("Spanish", this);  
        englishBtn->setChecked(true);  
    }  
  
public slots:  
    void printSelectedLanguage() {  
        // 获取当前选中的 QPushButton 控件并打印它的文本  
        QPushButton* selectedBtn = nullptr;  
        for (QPushButton* btn : {englishBtn, frenchBtn, germanBtn, spanishBtn}) {  
            if (btn->isChecked()) {  
                selectedBtn = btn;  
                break;  
            }  
        }  
        if (selectedBtn) {  
            selectedBtn->print();  
        }  
    }  
  
private:  
    QPushButton* englishBtn;  
    QPushButton* frenchBtn;  
    QPushButton* germanBtn;  
    QPushButton* spanishBtn;  
};  
  
int main(int argc, char* argv[]) {  
    QApplication app(argc, argv);  
  
    // 创建 Languages 对象并连接 signals 和 slots  
    Languages lang;  
    QObject::connect(englishBtn, &QPushButton::clicked, &lang, &Languages::printSelectedLanguage);  
    QObject::connect(frenchBtn, &QPushButton::clicked, &lang, &Languages::printSelectedLanguage);  
    QObject::connect(germanBtn, &QPushButton::clicked, &lang, &Languages::printSelectedLanguage);  
    QObject::connect(spanishBtn, &QPushButton::clicked, &lang, &Languages::printSelectedLanguage);  
  
    // 自适应窗口大小并显示窗口  
    QMainWindow window;  
    window.setCentralWidget(&lang);  
    window.resize(QApplication::desktop()->size());  
    window.show();  
  
    return app.exec();  
}

#如有帮助,恭请采纳

你说的和这个功能的重点应该是移动位置,勾选和点击事件你应该都会。 那要实现打钩就会转移到被点击那一栏的后面,首先需要获取到点击位置的组件的索引,

# 获取点击的按钮索引  
index = self.layout().indexOf(self.sender())  

然后将按钮移动到被点击那一栏的后面:

 # 将按钮移动到被点击那一栏的后面  
        sender().setParent(self.layout().itemAt(index).widget())  
        sender().setGeometry(self.layout().itemAt(index).widget().geometry())  
        sender().setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsUserTristate | Qt.ItemIsEnabled)  
        sender().setCheckState(Qt.Checked)  

可以使用QButtonGroup和信号与槽函数来实现