Ошибка соединения Qt 5 в QGLwidget [дубликат]

С помощью raw SQL вы можете использовать CONCAT:

  • В Python
    df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
    df.registerTempTable("df")
    sqlContext.sql("SELECT CONCAT(k, ' ',  v) FROM df")
    
  • В Scala
    import sqlContext.implicits._
    
    val df = sc.parallelize(Seq(("foo", 1), ("bar", 2))).toDF("k", "v")
    df.registerTempTable("df")
    sqlContext.sql("SELECT CONCAT(k, ' ',  v) FROM df")
    

Начиная с Spark 1.5.0 вы можете использовать функцию concat с API DataFrame:

  • В Python:
    from pyspark.sql.functions import concat, col, lit
    
    df.select(concat(col("k"), lit(" "), col("v")))
    
  • В Scala:
    import org.apache.spark.sql.functions.{concat, lit}
    
    df.select(concat($"k", lit(" "), $"v"))
    

Также существует функция concat_ws, которая принимает разделитель строк в качестве первого аргумента.

90
задан Toby Speight 18 May 2016 в 15:20
поделиться

3 ответа

Вышеприведенные решения работают, но я решил это несколько иначе, используя макрос. Так что на всякий случай здесь:

#define CONNECTCAST(OBJECT,TYPE,FUNC) static_cast<void(OBJECT::*)(TYPE)>(&OBJECT::FUNC)

Добавьте это в свой код.

Затем ваш пример:

QObject::connect(spinBox, &QSpinBox::valueChanged,
             slider, &QSlider::setValue);

Становится:

QObject::connect(spinBox, CONNECTCAST(QSpinBox, double, valueChanged),
             slider, &QSlider::setValue);
0
ответ дан Basile Perrenoud 28 August 2018 в 12:49
поделиться

На самом деле вы можете просто обернуть свой слот лямбдой и это:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
    slider, &QSlider::setValue);

будет выглядеть лучше. : \

6
ответ дан Newlifer 28 August 2018 в 12:49
поделиться

Сообщение об ошибке:

Ошибка

: нет соответствующей функции для вызова QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))

Важной частью этого является упоминание " неразрешенный перегруженный тип функции ". Компилятор не знает, имеете ли вы QSpinBox::valueChanged(int) или QSpinBox::valueChanged(QString).

Существует несколько способов разрешения перегрузки:

  • Предоставить подходящий шаблонный параметр к connect()

    QObject::connect<void(QSpinBox::*)(int)>(spinBox, &QSpinBox::valueChanged,
                                             slider,  &QSlider::setValue);
    
    Это заставляет connect() разрешить &QSpinBox::valueChanged перегрузку, которая принимает int. Если у вас есть нерешенные перегрузки для аргумента slot, вам нужно будет предоставить второй аргумент шаблона connect(). К сожалению, нет синтаксиса, чтобы попросить, чтобы первый был выведен, поэтому вам нужно будет предоставить оба. Это может помочь второй подход:
  • Использовать временную переменную правильного типа

    void(QSpinBox::*signal)(int) = &QSpinBox::valueChanged;
    QObject::connect(spinBox, signal,
                     slider,  &QSlider::setValue);
    
    Назначение signal выберет желаемую перегрузку, и теперь это может быть успешно заменяется в шаблоне. Это работает одинаково с аргументом «slot», и в этом случае я считаю его менее громоздким.
  • Использовать преобразование

    Здесь мы можем избежать static_cast, так как это просто принуждение, а не устранение защиты языка. Я использую что-то вроде:
    // Also useful for making the second and
    // third arguments of ?: operator agree.
    template<typename T, typename U> T&& coerce(U&& u) { return u; }
    
    Это позволяет нам писать
    QObject::connect(spinBox, coerce<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged),
                     slider, &QSlider::setValue);
    
11
ответ дан Toby Speight 28 August 2018 в 12:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: