Completer가 보이는 UI를 custom할 수 있다.

그래서 준비한 2탄

treeview도 가능하고

table view도 가능하다.

QStringListModel *dateModel = new QStringListModel(stringList);


#1 completer를 표시할 UI를 생성한다. 예제는 tableview

QTableView* tableView = new QTableView(dateModel);
patientViewModel->setParent(tableView);
tableView->horizontalHeader()->setVisible(false);
tableView->setShowGrid(false);

dateCompleter->setPopup(tableView);//


그리고 itemdelegate를 set해서 tableview를 더 풍성하게 보이고 싶다면...


#2 itemDelegate를 생성한다.

이 생성한 itemdelegate를 tableview에 넣어도 반영되지 않는다. 다음과 같이  completer의 popup에 바로 set해줘야 한다.!!!
dateCompleter->popup()->setItemDelegate(itemDelegate);


#3 model을 생성해서 임의로 만들고 싶다면?

QStandardItemModel *completerModel = new QStandardItemModel();

index = 0;

for (const auto& curRecord : records)
{
    QString name = list[index].name;
    QString genderString = list[index].gender
    QString birth = list[index].birth;
    completerModel->setItem(index, 0, new QStandardItem(name));
    completerModel->setItem(index, 1, new QStandardItem(genderString));
    completerModel->setItem(index, 2, new QStandardItem(birth));
    index++;
} 
return completerModel;
}


by 무위자연 2018.12.06 17:33

QTableView::item

{

background-color : bg_white;

margin-bottom: 10px;

border-bottom : 1px solid contents_outer;

border-top : 1px solid contents_outer;

outline:0px;

}


이런 식의 정보가 아니다!

tableView->verticalHeader()->setDefaultSectionSize(120);

by 무위자연 2018.11.29 18:21

관련 에러 메시지 : 

QObject::connect No such slot QLineEdit::slotUpdateClearButton(const QString&)


해당 클래스는 QLineEdit을 상속 받은 custom 클래스다

다음과 같이 connect했으나 에러가 발생함.


connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(slotUpdateClearButton(const QString&)));


해당 메시지는 slot이 없다는 것으로 오해 할 수 있다.


하지만 이건 QObject가 그런(?) slot과 연결할 수 없다는 의미이다.


즉 비록 QLineEdit을 상속 받았지만 해당 custom class 존재를 QObject가 모르겠다는 의미이다.


이 경우 

class CustomWidget : public QLineEdit

{

Q_OBJECT//이거를 넣어줘야 한다!!!!

public:

explicit CustomWidget (bool enableClearBtn = false, QWidget* parent = nullptr);

virtual ~CustomWidget ();




by 무위자연 2018.11.20 15:59
일시 : 2018.11.6

S.시작하며
-개발 세미나 참석은 처음이라 긴장도 되고 외롭기도 했는데.
-ios 개발은 원래 외로운 거더라고요~ 대부분 3명 이하의 조직?에서 개발.. 혼자도 많고
-개발도 잘하고 발표도 잘 하는 분들 많더라!! 이봉원님은 목소리까지 짱!
-계속 공부하고 계속 새로운 것을 봐야 하고 다른 사람들은 뭐하는지 보고 살아야 겠다
-뭔가 소통하고 싶었으나...말 걸...어려웠다ㅠ

-내 기준에서 주목 혹은 기록하고 싶은 것만 정리하면 다음과 같다.
A. iOS 라브 Ruby - 김은영님
ruby로 만들어진 bundler를 이용해서 개발/배포 작업에서 도움이 되는 gem을 사용한다.(사용법은 cocoapod과 동일)
*주목한 gem

1. Houston : local 환경에서 push 테스트할  있는  gem

https://github.com/nomad/houston 

2. Fastlane :  app store 업로드  심사 신청까지 해주는 gem

https://github.com/fastlane/fastlane 

가장 큰 이점은 로컬에서 심사를 위한 업로드로 40분씩  때리지 않아도 된다~


B. RIBs - 김남현님

우버에서 제안하는 크로스 프레임 워크

https://github.com/uber/RIBs/wiki 

모든 Flow를 Tree를 그린다는 관점에서 접근하는 것은 비단 모바일에서만 가능한 일은 아닐 것으로 보인다.


C. GraphQL

REST Api의 단점을 보완하고 HTTP의 특성을 잘 살려낸 API 구현 방식

차세대가 될지는 지켜봐야 하지만 장점이 많은 방식이고 이미 적용된 사례가 생겨나고 있음(GitHub)

https://graphql.org/learn/  


Z.맺으며

경품.

벌킨, 에어팟, 애플와치4!!!!....는 다 남 이야기 ㅠ


by 무위자연 2018.11.07 13:51


just simple


example function : drawFooterArea(QPainter *painter, const QRect& rect, const QSqlRecord& record) const


1 set pen / brush the color you want

painter->setPen(Qt::red);

painter->setBrush(Qt::red);


2. draw Ellipse

painter->drawEllipse(rect);


if you don't set brush, just show circle line


by 무위자연 2018.09.27 10:36


함수 선언을..

void error(char const *msg, bool showKind = true, bool exit);

이런 식으로 하면 다음과 같은 애러가 뜨게 된다.

default argument not at end of parameter list


이것의 의미는 끝에 기본 값을 안 줬다 이며 이것을 해결하기 위해서는

끝에서부터 기본값을 주기 시작해야 한다는 의미이다.

exit도 기본 값을 주던지 아니면 showKind를 제일 뒤로 보내야 한다~


더 자세한 설명은 https://stackoverflow.com/questions/5637679/default-argument-in-the-middle-of-parameter-list 

by 무위자연 2018.09.20 12:29

enum 정의를 해서 사용하는데

그 정의가 늘어날 때마다 관련 코드를 넣는 것은 매우 고통스러운 일이다.

그리고 enum 실제 값과 해당하는 enum을 찾아서 처리해야하는 일들이 생긴다.

그 럴 때 사용하는 것이  QMetaEnum( 관련 문서 : http://doc.qt.io/qt-5/qmetaenum.html )이다.

예제.

class Currency : public QObject
{
Q_OBJECT
public:
enum class CurrencyType
{
    ABC = 1,
    CDE = 2,
    DEF = 3,
   _count,//이것이 있어야 함!!!
}
Q_ENUM(CurrencyType)

QObject를 상속 받아서 정의하고 _count를 넣은 다음에 Q_ENUM으로 정의해주어야 한다.
enum 값을 int로만 사용하면 static_cast<int>를 이용하면 충분하지만 enum의 이름을 사용할 필요가 있을 때 사용한다.

#1 QString to enum
QString 값을 enum value로 바꿔준다.
auto currencyMap = QMetaEnum::fromType<Currency::CurrencyType>(); //enum 클래스를 가지는 객체를 만든다.
QString currency = "ABC";
for (qint32 i = 0; i < currencyMap.keyCount(); i++)
{
    if (currencyMap.key(i) == currency)//key 값과  QString을 비교한다.
   {
                return Currency::CurrencyType(i); 
     }
}


#2 enum to QString

Currency::CurrencyType tempType = currency;

QString currencyString = QVariant::fromValue(currency).value<QString>();


by 무위자연 2018.09.11 10:48


#1 QObject를 상속 받은 tooltip을 처리할 class를 선언한다


at ZenoToolTipHelper.h

class ZenoToolTipHelper : public QObject

{

Q_OBJECT

public:

explicit ZenoToolTipHelper(QObject* parent = NULL)

: QObject(parent)

{

}


protected:

bool eventFilter(QObject* obj, QEvent* event);

};


at ZenoToolTipHelper.cpp

#include <QAbstractItemView>

#include <QToolTip>

#include <QEvent>

#include <QHelpEvent>

bool ZenoToolTipHelper::eventFilter(QObject* obj, QEvent* event)

{

if (event->type() == QEvent::ToolTip)

{

QAbstractItemView* view = qobject_cast<QAbstractItemView*>(obj->parent());

if (view == nullptr)

{

return false;

}


QHelpEvent* helpEvent = static_cast<QHelpEvent*>(event);

QPoint pos = helpEvent->pos();

QModelIndex index = view->indexAt(pos);

if (index.isValid() == false)

return false;

//row , column을 적절하게 판단하여서 tooltip을 보여준다.

QFontMetrics fm(view->font());

QRect rect = view->visualRect(index);

int rectWidth = rect.width();


QToolTip::showText(helpEvent->globalPos(),               "tooltip 내용들", view, rect);

return true;


}

return false;

}


#2 #1에서 만들 class를 tableView에 set한다.

tableView->viewport()->installEventFilter(new ZenoToolTipHelper());

by 무위자연 2018.07.11 15:06

QTextEdit에는 setMaxLength 함수가 없다


입력 글자수를 제한하기 위해서 다음과 같이 SLOT을 Connect한다


//member variable

QString tempMemo_ = {};



QTextEdit* memoEdit = dialog_->findChild<QTextEdit*>(toString(ControlID::editMemo));


if (memoEdit->toPlainText().length() > 256)//set maxlength 256

{


disconnect(memoEdit, SIGNAL(textChanged()), this, SLOT(slotValueChanged_memo())));


QTextCursor currentCursor = memoEdit->textCursor();


int pos = currentCursor.position();


memoEdit->setPlainText(tempMemo_);


currentCursor.setPosition(pos - 1, QTextCursor::MoveMode::MoveAnchor);


memoEdit->setTextCursor(currentCursor);


connect(memoEdit, SIGNAL(textChanged()), this, SLOT(slotValueChanged_memo())));


}


else

{

//keep text at last input

tempMemo_ = memoEdit->toPlainText();

}


by 무위자연 2018.03.12 11:16

다음과 같은 요구사항이 있을 경우 상당히 구현하기 까다롭다


requirement : 

YYYY MM DD 로 제한없는 입력보다는 제한된 리스트를 제공하여 콤보박스 형태로 보여줌

단, 직접 입력도 가능하도록 처리

년: 1900~2018 까지 제공
월: 01~12 까지 제공
일: 01~31 까지 제공


이 때 쓸만한 것이 QCompleter


example

QLineEdit으로 text 입력을 받고 여기에 QCompleter를 붙이는 형태이다.

이 때 중요한 것은 model을 설정하는 것. 

1. 파일에서 모델을 읽어오기도 하고 

> 예제  completer->setModel(modelFromFile(":/resources/wordlist.txt")) :: (링크)

2. sql model을 설정하고 특정 컬럼의 데이터만 대상만 보이게 할수도 있다.

> 예제

QSqlQueryModel sample;

completer->setModel(sqmple);

completer->setCompletionColumn(specific column name);

completer->setCompletionMode(QCompleter::PopupCompletion);

3. 하기와 같이 간단하게 string model을 만들수도 있다.


QStringList stringList;

for (int i = 1; i <= selecteddate.daysInMonth(); i++)

{

stringList << QString().sprintf("%02d", i);

}

QStringListModel *dateModel = new QStringListModel(stringList);

QCompleter* dateCompleter = new QCompleter;

dateCompleter->setModel(dateModel);


dateEdit->setCompleter(dateCompleter); //dateEdit은 QLineEdit

by 무위자연 2018.02.22 16:28