qt为啥raise没有效果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt为啥raise没有效果相关的知识,希望对你有一定的参考价值。

qt为什么raise没有效果,:新建一个控件的子类,然后再控件上右键点击提升,没有效果

原因1: 查看提升的控件的类型是否正确

Qt 提升窗口部件 没有效果

原因2:查看提升的子类的路径是否正确。如果C++文件跟.pro文件在同一级目录下,直接写头文件,如果在子目录下要写子目录,前面要加 ./

Qt 提升窗口部件 没有效果

原因3:如果都正确,还是没有效果,就把这个控件删除,再重新拉入一个控件,再提升。(可以新拉入一个控件,把它提升,如果提升成功,而原来的控件提升失败,就是这种原因。)

原因4:子类有样式表,修改样式时,提升后没有效果,运行时就有效果了
参考技术A qt的raise函数不能用于处理异常,它只是将当前函数的状态抛出给调用者。如果要处理异常,请使用try-except语句或者自定义函数来捕获并处理异常。 参考技术B 因为这款套装是普通级别的,所以是没有专门的特效效果的,如果想要效果可以在商城中购买稀有等级的套装。

为啥 raise_for_status() 没有捕捉到错误?

【中文标题】为啥 raise_for_status() 没有捕捉到错误?【英文标题】:Why raise_for_status() did not catch the error?为什么 raise_for_status() 没有捕捉到错误? 【发布时间】:2019-05-16 00:41:21 【问题描述】:

尝试在 current_track() 函数中检查无 200 响应。可能是什么问题?它抛出 JSONDecodeError 错误。但是,如果我正确理解 raise_for_ status 它应该阻止该函数尝试从错误的网页加载 JSON?如果我在没有此检查的情况下运行脚本并使用取消注释行 check_playback() 它成功捕获 JSONDecodeError。

脚本正在从 Spotify 获取数据并将其置于 vk.com 上的状态。

import config
import webbrowser
import requests
import furl
import secrets
import string
import time
import os
import simplejson as json


URL_CODE_BASE_VK = 'https://oauth.vk.com/authorize'
URL_CODE_BASE_SP = 'https://accounts.spotify.com/authorize'
URL_TOKEN_VK = 'https://oauth.vk.com/access_token'
URL_TOKEN_SP = 'https://accounts.spotify.com/api/token'
URL_TRACK = 'https://api.spotify.com/v1/me/player/currently-playing'
URL_STATUS = 'https://api.vk.com/method/status.set'
EXP_IN_TOKEN_SP = 3400
EXP_IN_TOKEN_VK = 86400
FILE_TOKEN_VK = 'vk_token.json'
FILE_TOKEN_SP = 'sp_token.json'


def get_auth_code_vk():
    url_code_params = 
                        'client_id': config.CLIENT_ID_VK,
                        'response_type': 'code',
                        'redirect_uri': 'https://oauth.vk.com/blank.html',
                        'v': 5.92,
                        'scope': 'status',
                        'state': gen_state(),
                        'display': 'page'
    

    code = url_open(URL_CODE_BASE_VK, url_code_params)
    return parse_code(code)


def get_auth_code_sp():
    url_code_params = 
                        'client_id': config.CLIENT_ID_SP,
                        'response_type': 'code',
                        'redirect_uri': 'https://www.spotify.com/',
                        'scope': 'user-read-currently-playing',
                        'state': gen_state()
    

    code = url_open(URL_CODE_BASE_SP, url_code_params)
    return parse_code(code)


def gen_state():
    symbols = string.ascii_lowercase + string.digits
    return ''.join(secrets.choice(symbols) for _ in range(12))


def url_open(url_base, url_params):
    url_code_full = furl.furl(url_base).add(url_params).url
    webbrowser.open_new_tab(url_code_full)
    input_url = input('Enter the whole URL, that you have been redirected on: ')

    return input_url


def parse_code(url):
    return (url.split("code=")[1]).split("&state=")[0]


def get_token_vk():
    data = 
            'grant_type': 'authorization_code',
            'code': get_auth_code_vk(),
            'redirect_uri': 'https://oauth.vk.com/blank.html',
            'client_id': 6782333,
            'client_secret': config.CLIENT_SECRET_VK
    

    response = requests.post(url=URL_TOKEN_VK, data=data).json()
    write_file(FILE_TOKEN_VK, response)


def get_token_sp():
    data = 
            'grant_type': 'authorization_code',
            'code': get_auth_code_sp(),
            'redirect_uri': 'https://www.spotify.com/',
            'client_id': config.CLIENT_ID_SP,
            'client_secret': config.CLIENT_SECRET_SP
    

    response = requests.post(url=URL_TOKEN_SP, data=data).json()
    write_file(FILE_TOKEN_SP, response)


def write_file(tkn_file, response):
    dict = 
    dict['token'] = response["access_token"]
    dict['time'] = time.time()

    with open(tkn_file, 'w') as file:
        file.write(json.dumps(dict))


def load_file(tkn_file):
    with open(tkn_file) as file:
        data = json.load(file)
    return data


def set_status():
    params = 
              'v': 5.92,
              'access_token': load_file(FILE_TOKEN_VK)['token'],
              'text': current_track()
    

    set_status = requests.get(url=URL_STATUS, params=params)


def track_data():
    tkn_file =  load_file(FILE_TOKEN_SP)['token']
    headers = 
               'Accept': 'application/json',
               'Authorization': f'Bearer tkn_file'
    

    return requests.get(url=URL_TRACK, headers=headers)


def current_track():
    response = track_data()
    print(response)

    try:
        response.raise_for_status()
    except requests.exceptions.HTTPError as e:
        return "Error: " + str(e)

    # data = track_data().json()
    data = response.json()
    artist = data['item']['artists'][0]['name']
    track = data['item']['name']

    return(f'artist - track')


def check_playback():
    set_status()
    print(current_track())
    # try:
    #     set_status()
    #     print(current_track())
    # except json.decoder.JSONDecodeError:
    #     print('Not playing')


def token_missing(file):
    return not os.path.isfile(file)


def token_expired(file, exp_in):
    return time.time() - load_file(file)['time'] > exp_in


def token_not_valid(file, exp_in):
    return token_missing(file) or token_expired(file, exp_in)


def run_script():
    if token_not_valid(FILE_TOKEN_VK, EXP_IN_TOKEN_VK):
        get_token_vk()

    if token_not_valid(FILE_TOKEN_SP, EXP_IN_TOKEN_SP):
        get_token_sp()

    check_playback()


if __name__ == "__main__":
    run_script()

Error screen

【问题讨论】:

请注意,页面可以返回 200 状态但包含“损坏”的 JSON。在尝试解析响应之前,您应该真正检查响应的内容作为原始文本。 请尝试提供您所询问内容的最小示例。如果它在 VK 位运行之前崩溃,则将其删除。如果您依赖需要身份验证的外部 API,则可以将其替换为对 httpbin 的调用,依此类推。 抱歉没有提供所有信息,@Bakuriu,@Teo Klestrup Röijezon 我实际上是在 current_track 函数中打印响应,它说有 204 状态。所以没有JSON,但实际上并不是错误。只是一个“无数据”的回应。出于某种原因,我有一种错误的印象,即每次没有 200 响应时,raise_for_status 都会引发异常。 所以问题是,我真的需要在这个脚本的任何地方使用raise_for_status 吗? @Flynn84 这取决于。 HTTP 有几十个状态码。所有 2XX 状态码都表示成功。通常 3XX 状态代码也是成功的,尽管它们会告诉您重定向。只有 4XX 和 5XX 状态码是错误的。 raise_for_status 仅将 4XX 和 5XX 视为错误。 204 NO CONTENT是一个很好的回应,所以你应该正确处理它。 【参考方案1】:

raise_for_status() 只会在 服务器 向您报告错误时引发异常(即便如此,只有当它实际上遵循 HTTP 规范并返回 HTTP 错误代码时)。

库无法知道响应不正确。即使它是正确格式的 JSON,它也不知道您希望它遵循什么模式(应该存在哪些字段,以及这些字段应该具有什么类型)。即使它知道架构并对其进行了验证,它也无法知道数据实际上是正确的并且不是当场编造的。

【讨论】:

以上是关于qt为啥raise没有效果的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 raise_application_error 未执行之前的触发器内部代码?

Qt:为啥我的按钮没有收到信号?

为啥VS2013没有QT菜单 ??

用QT写程序,为啥运行成功了,却没有程序界面出来啊?

为啥我执行 Python QT5 代码时没有显示图标和图像?

为啥我想在 Qt 小部件上绘制的“矩形”没有出现?