大大大西瓜嘞 2023-10-13 16:33 采纳率: 33.3%
浏览 12

Qtablewidget插入Qcombox后按键点击异常

在qt的表格里插入combox,然后在空的表格上,先点击一下,等表格被选中之后,按任意字母,程序就会卡死。正常情况下点击表格选中后,点击数字键会直接将数字写入表格,点击字符按键,会进入表格信息写入的状态,但是按下的字符键不会写入表格中。
部分代码如下:

    for (int row = 3; row < ui.tableWidget->rowCount(); ++row) {
        QComboBox* comboBox = new QComboBox();//类型
        // 添加选项
        comboBox->addItem("");
        comboBox->addItem("String");
        comboBox->addItem("Double");
        comboBox->addItem("Int");
        // 设置下拉框
        ui.tableWidget->setCellWidget(row, 2, comboBox);
 }

报错位置:

bool QObject::event(QEvent *e)
{
    switch (e->type()) {
    case QEvent::Timer:
        timerEvent((QTimerEvent*)e);
        break;

    case QEvent::ChildAdded:
    case QEvent::ChildPolished:
    case QEvent::ChildRemoved:
        childEvent((QChildEvent*)e);
        break;

    case QEvent::DeferredDelete:
        qDeleteInEventHandler(this);
        break;

    case QEvent::MetaCall:
        {
...


```c++
bool QApplication::notify(QObject *receiver, QEvent *e)
{
    Q_D(QApplication);
    // no events are delivered after ~QCoreApplication() has started
    if (QApplicationPrivate::is_app_closing)
        return true;

    if (Q_UNLIKELY(!receiver)) {                        // serious error
        qWarning("QApplication::notify: Unexpected null receiver");
        return true;
    }

#ifndef QT_NO_DEBUG
    QCoreApplicationPrivate::checkReceiverThread(receiver);
#endif


```c++
QThreadData *QThreadData::current(bool createIfNecessary)
{
    qt_create_tls();
    QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
    if (!threadData && createIfNecessary) {
        threadData = new QThreadData;
        // This needs to be called prior to new AdoptedThread() to
        // avoid recursion.
        TlsSetValue(qt_current_thread_data_tls_index, threadData);
        QT_TRY {
            threadData->thread = new QAdoptedThread(threadData);
        } QT_CATCH(...) {
            TlsSetValue(qt_current_thread_data_tls_index, 0);
            threadData->deref();
            threadData = 0;
            QT_RETHROW;
        }

每次报错的位置也不一样,但都是提示未处理的异常。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-13 18:13
    关注

    【以下回答由 GPT 生成】

    您遇到的问题是在使用QTableWidget插入QComboBox后,按键点击时出现异常。 您期望的行为是在表格被选中后,按数字键会将数字直接写入表格,按字符键会进入表格信息写入状态,但按下的字符键不会写入表格。

    解决方案: 通过分析代码和错误报告,可以尝试以下解决方案: 1. 确保引入了正确的Qt头文件和命名空间。

    1. 您可以尝试在创建QComboBox后,为其设置编辑策略和焦点策略,以确保在表格选中时按下键盘不会触发异常。具体代码如下:
    // 创建QComboBox
    QComboBox* comboBox = new QComboBox();
    // 添加选项
    comboBox->addItem("");
    comboBox->addItem("String");
    comboBox->addItem("Double");
    comboBox->addItem("Int");
    // 设置下拉框
    ui.tableWidget->setCellWidget(row, 2, comboBox);
    // 设置编辑策略和焦点策略
    comboBox->setEditable(true);
    comboBox->setFocusPolicy(Qt::ClickFocus);
    
    1. 如果以上步骤没有解决问题,您可以尝试重写QComboBox的event函数,以处理键盘事件。具体代码如下:
    class CustomComboBox : public QComboBox
    {
    public:
        explicit CustomComboBox(QWidget* parent = nullptr) : QComboBox(parent) {}
    
    protected:
        bool event(QEvent* event) override
        {
            if (event->type() == QEvent::KeyPress)
            {
                QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
                // 在这里处理按键事件,例如判断按下的按键并执行相应操作
    
                // 调用基类的event函数处理事件
                return QComboBox::event(event);
            }
            return QComboBox::event(event);
        }
    };
    
    // 创建自定义的ComboBox
    CustomComboBox* comboBox = new CustomComboBox();
    // 添加选项
    comboBox->addItem("");
    comboBox->addItem("String");
    comboBox->addItem("Double");
    comboBox->addItem("Int");
    // 设置下拉框
    ui.tableWidget->setCellWidget(row, 2, comboBox);
    

    如果以上解决方案都没有解决您的问题,可能需要进一步分析代码和错误报告,或者参考相关文档和资源来解决此问题。

    我无法提供更加具体的解决方案或代码片段,因为缺少问题的完整上下文和相关代码。希望这些解决方案对您有所帮助。如果需要进一步的帮助,请提供更多详细信息。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月13日