먼가 설치하려는데 먼가 안되서, venv 사용 해보는 중

$ pip3 install keras mobilenet-v3 numpy tensorflow
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.14/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

 

인자없이 모듈만 불러오면 당연히(?) 실행 안되고 에러가 난다.

$ python3 -m venv 
usage: python3 -m venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade]
                       [--without-pip] [--prompt PROMPT] [--upgrade-deps] [--without-scm-ignore-files]
                       ENV_DIR [ENV_DIR ...]
python3 -m venv: error: the following arguments are required: ENV_DIR

 

activate를 불러오고 deactivate 명령으로 종료한다.

아무생각없이 자꾸 exit 해서 터미널 닫아버리네 -_-

$ python3 -m venv venv
$ source venv/
.gitignore  bin/        include/    lib/        lib64/      pyvenv.cfg  
$ source venv/bin/activate
(venv) $ 

(venv) $ deactivate


 

대충 rootfs가 생겨난다.

$ tree venv/ -d -L 1
venv/
├── bin
├── include
├── lib
└── lib64 -> lib

 

어쩐지 찾아도 안나온다 했더니 함수로 등록해버리는 듯

$ cat venv/bin/activate
# This file must be used with "source bin/activate" *from bash*
# You cannot run it directly

deactivate () {
    # reset old environment variables
    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
        PATH="${_OLD_VIRTUAL_PATH:-}"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # Call hash to forget past locations. Without forgetting
    # past locations the $PATH changes we made may not be respected.
    # See "man bash" for more details. hash is usually a builtin of your shell
    hash -r 2> /dev/null

    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
        PS1="${_OLD_VIRTUAL_PS1:-}"
        export PS1
        unset _OLD_VIRTUAL_PS1
    fi

    unset VIRTUAL_ENV
    unset VIRTUAL_ENV_PROMPT
    if [ ! "${1:-}" = "nondestructive" ] ; then
    # Self destruct!
        unset -f deactivate
    fi
}

 

새로 생성한 환경은 13M 정도

$ du -h -d 1 test
13M test/lib
40K test/bin
4.0K test/include
13M test

 

3개 설치했더니

pip3 install keras mobilenet-v3 numpy

 

161M 로 확 늘었다. 내려가서 보니 pip가 설치되서 그렇네.

$ du -h -d 1 venv/
161M venv/lib
128K venv/bin
4.0K venv/include
161M venv/
Posted by 구차니
Programming/qt2026. 6. 5. 17:03

전체 화면을 scaling 하는 방법. 일장일단이 있겠지만

화면 비율이 다르면 답없는 건 매한가지 ㅠㅠ

 

[링크 : https://doc.qt.io/archives/qt-5.15/qgraphicsproxywidget.html]

Posted by 구차니
Programming/qt2026. 6. 5. 14:57

QComboBox 등으로 언어를 선택하고 app.installTranslator()를 호출하면

모든 위젯들에게 자동으로 changeLanguage()가 발송된다 (즉, 수동으로 언어 변경 메시지를 전체에 뿌릴 필요가 없다)

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTranslator myappTranslator;
    if (myappTranslator.load(QLocale::system(), u"myapp"_s, u"_"_s, u":/i18n"_s))
        app.installTranslator(&myappTranslator);

    return app.exec();
}

 

위젯들에게 각각 아래의 이벤트 핸들러를 추가해주면 되는데

헤더에는 protected: 에 override 해서 해주면되고

protected:
    void resizeEvent(QResizeEvent *event) override;
    void changeEvent(QEvent *event) override;

 

함수에서는 별거 없이 retranslateUi()를 호출해주면된다.

void MyWidget::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        ui.retranslateUi(this);
    } else
        QWidget::changeEvent(event);
}

[링크 : https://doc.qt.io/qt-6/ko/i18n-source-translation.html#prepare-for-dynamic-language-changes]

 

확실히 이렇게 하니 시그널들 서로 연결한다고 고생안해도 되서 개꿀

'Programming > qt' 카테고리의 다른 글

QGraphicsProxyWidget  (0) 2026.06.05
QT 자식 위젯으로 생성 / 부모 위젯 연결  (0) 2026.06.05
qt QTabWidget 사용  (0) 2026.06.04
qt 다국어지원 - 보이지 않는 메시지 추가하기  (0) 2026.06.02
QCombobox + 다국어  (0) 2026.05.21
Posted by 구차니
Programming/qt2026. 6. 5. 12:07

위젯 생성시 this를 넣어서 하면, 자식으로 생성되어 별도의 창으로 뜨지 않는다.

QWidget test = new QWidget(); // 독립된 창으로 뜸
test.show();

QWidget test2 = new QWidget(this); // Mainwindow 안에 뜸
test2.show();

 

간단하게(?) parent를 지정해주냐 안해주냐의 차이인듯.

class test : public QWidget
{
    Q_OBJECT

public:
    explicit test(QWidget *parent = nullptr);
    ~test();
}

 

'Programming > qt' 카테고리의 다른 글

QGraphicsProxyWidget  (0) 2026.06.05
QT 다국어 언어 설정 전파  (0) 2026.06.05
qt QTabWidget 사용  (0) 2026.06.04
qt 다국어지원 - 보이지 않는 메시지 추가하기  (0) 2026.06.02
QCombobox + 다국어  (0) 2026.05.21
Posted by 구차니
Programming/qt2026. 6. 4. 11:49

도움은 크게 안되었지만 아이디어를 얻은 페이지

[링크 : https://stackoverflow.com/questions/59594800/confining-background-color-to-triangular-tab-on-qtabbar]

 

Step 1. widget에 Tab Widget을 드래그 한다.

 

Step 2. Tab Widget 사이즈 조절. 만만한게 바로 grid 커져라 얍!

 

Step 3. 탭하나 추가하기

원하는 탭을 하나 선택하고 

 

상위 QTabWidget 에서 우클릭해서 Insert Page - After Current Page

 

그러면 tab_3 추가

 

 

gui 상에서 우클릭해도 바로 되긴한다.

Posted by 구차니
Programming/qt2026. 6. 2. 15:52

gpt 가라사대~

아래와 같이 QT_TRANSLATE_NOOP()을 이용해서 추가하면

GUI 에서 내용이 바뀌기 때문에 여러개 메시지를 넣고 출력하지 않도록 할 필요 없이

내부적으로 tr()을 이용해 끌어오면 될 듯 하다.

static const char *dummy[] = {
    QT_TRANSLATE_NOOP("Language", "Korean"),
    QT_TRANSLATE_NOOP("Language", "English"),
    QT_TRANSLATE_NOOP("Language", "Japanese")
};

 

아래 정의 된 것 처럼, scope와 메시지로 되어있는데

#define QT_TRANSLATE_NOOP(scope, x) x

 

scope는 qt에서 생성한 class 이름으로 하면, 별도의 번역으로 분리되지 않고 하나로 잘 뭉쳐서 나오게 된다.

Posted by 구차니
Programming/qt2026. 5. 21. 14:57

combobox 추가하고

 

추가된 애를 더블 클릭하면

 

Edit Combobox 라고 뜨는데

여기에 한줄씩 추가해서 넣으면 된다.

 

그나저나.. 왜 프로퍼티 창에서 바로 넣을수 있는 곳은 없는걸까?

[링크 : https://dibrary.tistory.com/21]

 

아래는 GPT가 짜준거

일단 값이 변경되는 이벤트에서 언어 파일을 읽게 하고,

changeEvent()를 오버라이드 해서 언어 변경 이벤트에 대해서 적용하고

combobox의 시그날 발생을 잠시 막고(갱신되면서 0번 인덱스로 가는것 방지)

이전의 인덱스를 복구해주고, 시그널 발생을 다시 가능하게 해주는 식으로 끝. 천잰데?

protected:
    void changeEvent(QEvent *event) override;

 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->s
// Connect combobox signal
    connect(ui->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::on_comboBox_currentIndexChanged);
}

void Widget::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        int currentIndex = ui->comboBox->currentIndex();
        ui->comboBox->blockSignals(true);
        ui->retranslateUi(this);
        ui->comboBox->setCurrentIndex(currentIndex);
        ui->comboBox->blockSignals(false);
    }
    QWidget::changeEvent(event);
}

void Widget::on_comboBox_currentIndexChanged(int index)
{
    QString langFile;
    switch(index) {
        case 0: langFile = "untitled_ko_KR"; break;
        case 1: langFile = "untitled_en_US"; break;
        case 2: langFile = "untitled_el_GR"; break;
        case 3: langFile = "untitled_fr_FR"; break;
        case 4: langFile = "untitled_es_ES"; break;
        case 5: langFile = "untitled_pt_PT"; break; // Note: combo says polish but translations exist for pt_PT
        case 6: langFile = "untitled_sk_SK"; break;
        case 7: langFile = "untitled_ru_RU"; break;
        default: langFile = "untitled_en_US"; break;
    }
    
    if (m_translator.load(":/i18n/" + langFile)) {
        qApp->installTranslator(&m_translator);
    }
}
Posted by 구차니
Programming/qt2026. 5. 20. 12:17

antigravity 가지고 물어보니 이거 하나 넣으라니 정말 되네.

 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_StyledBackground);
}

 

 

Qt::WA_StyledBackground 93 Indicates the widget should be drawn using a styled background.

[링크 : https://doc.qt.io/qt-6/qt.html]

[링크 : https://runebook.dev/ko/docs/qt/stylesheet-reference]

 

QWidget은 원래 배경 색상만 지원하도록 만든 클래스인가 보네..

[링크 : https://doc.qt.io/qt-6/stylesheet-reference.html]

'Programming > qt' 카테고리의 다른 글

qt 다국어지원 - 보이지 않는 메시지 추가하기  (0) 2026.06.02
QCombobox + 다국어  (0) 2026.05.21
QT 런타임중 언어 변경  (0) 2026.05.14
QT QMainWindow, QWidget, QDialog  (0) 2026.05.14
QT 창관리  (0) 2026.05.13
Posted by 구차니
Programming/qt2026. 5. 14. 17:49

아직 테스트는 못해봄.

일단 실행시에 LANG 으로 바꾸는건 해봤는데

실행중에 바꾸어야 할 것 같아서 찾아봄.

 

기존 translator을 제거(QApplication::removeTranslator)하고, 다시 install(위 적용 참조)한다. 
      
          app.removeTranslator(&translator);
          translator.load("lang/ko_kr");
          app.installTranslator(&translator);
      
    installTranslator하면, QEvent::LanguageChange이벤트가 발생한다. 이 이벤트로 번역문자열이 새로운 translator에 의해 적용되도록 한다. 
         
          void MainWindow::changeEvent(QEvent* event)
          {
              if (event->type() == QEvent::LanguageChange)
              {
                  // 디자이너에 의해 생성된 문자열
                  ui.retranslateUi(this);
            
                  // 코드에서 삽입한 문자열
                  retranslate();
              }
              QMainWindow::changeEvent(event);
          }

[링크 : https://dorigom.tistory.com/359]

'Programming > qt' 카테고리의 다른 글

QCombobox + 다국어  (0) 2026.05.21
qt widget 에서 배경화면 스타일 시트 적용 안될 경우  (0) 2026.05.20
QT QMainWindow, QWidget, QDialog  (0) 2026.05.14
QT 창관리  (0) 2026.05.13
QString arg()  (0) 2026.05.13
Posted by 구차니
Programming/qt2026. 5. 14. 15:30

 

QMainWindow

 -  내부는 QWidget 으로 채워질수 있음

 + setWindowModality(Qt::WindowModal)

 + show()

 + raise() 로 띄움

 QDialog

 -  별도 창에 표시되는 취상위 위젯

 + setWindowModality(Qt::WindowModal)

 + exec() 로 띄움

 - QWidget 기반

QWidget

 - 어떻게 보면 얘가 근본?

 [링크 : https://ggangtalife.tistory.com/entry/PyQt5-클래스-QMainWindow-QDialog-QWidget-차이점]

 

다이얼로그

 - modal 속성으로 주로 사용(제어권 독점) 

 - 확인/취소 누르는 용도

[링크 : https://coding-kindergarten.tistory.com/171]

'Programming > qt' 카테고리의 다른 글

qt widget 에서 배경화면 스타일 시트 적용 안될 경우  (0) 2026.05.20
QT 런타임중 언어 변경  (0) 2026.05.14
QT 창관리  (0) 2026.05.13
QString arg()  (0) 2026.05.13
qt 동적 크기  (0) 2026.05.12
Posted by 구차니